Teilen Sie Int in Int und geben Sie Int zurück

79

Ich brauche eine Funktion , die zwei bekommt Ints ( aund b) und kehrt A/Bals Int. Ich bin sicher, dass A/Bdas immer eine ganze Zahl sein wird.

Hier ist meine Lösung:

myDiv :: Int -> Int -> Int
myDiv a b = 
      let x = fromIntegral a
          y = fromIntegral b
      in truncate (x / y)

Aber wollen einfachere Lösung finden. Etwas wie das:

myDiv :: Int -> Int -> Int
myDiv a b = a / b

Wie kann ich Int in Int teilen und Int erhalten?

Demas
quelle

Antworten:

140

Warum nicht einfach benutzen quot?

quot a b

ist der ganzzahlige Quotient der ganzen Zahlen a und b, die gegen Null abgeschnitten sind.

Spitze
quelle
7
Oder a `quot` bfür die Infix-Liebhaber (wow, können Sie Backticks tatsächlich mit Backslash entkommen?).
38
Auch a `div` b; Wenn ich mich richtig erinnere, quotschneidet er ab (wie es Demas wollten) und divrundet gegen Null. Also (-3) `quot` 4 == 0und (-3) `div` 4 == -1.
Antal Spector-Zabusky
5
+1 für div. Mathematisch besser erzogen, quotist eine Hündin, wenn es negative Zahlen gibt.
Luqui
Das war ein Lebensretter für mich. Ich rang mit fromIntegral (ceiling (int1 / int2))und anderen Dingen - keine davon gab mir eine zurück Int, aber diese tat es.
MuffinTheMan
10
divrundet auf negative Unendlichkeit, nicht auf Null.
Lacuno
1

Folgendes habe ich getan, um mein eigenes zu machen:

quot' a b
         | a<b = 0  -- base case
         | otherwise = 1 + quot' a-b b
Jacob Stewart
quelle
2
Schön als Übung, aber nutzlos in der Produktion. Bei großen Zahlen ist es langsam (lineare Zeit) und hat einen hohen Speicherbedarf (nicht rekursiv). Bei negativen Zahlen ist es entweder falsch ( a<0) oder endet nie ( b<0).
Ruud Helderman