Podziel Int na Int i zwróć Int

79

Potrzebuję funkcji, która pobiera dwa Ints ( ai b) i zwraca A/Bjako Int. Jestem pewien, że A/Bzawsze będzie to liczba całkowita.

Oto moje rozwiązanie:

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

Ale chcę znaleźć prostsze rozwiązanie. Coś takiego:

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

Jak mogę podzielić Int na Int i otrzymać Int?

demas
źródło

Odpowiedzi:

140

Dlaczego po prostu nie użyć quot?

quot a b

jest ilorazem liczb całkowitych a i b obciętych w kierunku zera.

Spiczasty
źródło
7
Lub a `quot` bdla miłośników wrostków (wow, faktycznie można uciec od odwrotnego znaku ukośnika do odwrotnego znaku?).
38
Również a `div` b; jeśli dobrze pamiętam, quotobcina (tak jak chciał demas) i divzaokrągla w kierunku zera. Więc (-3) `quot` 4 == 0i (-3) `div` 4 == -1.
Antal Spector-Zabusky
5
+1 dla div. Bardziej grzeczny matematycznie quotjest dziwką, gdy wokół są liczby ujemne.
luqui,
To uratowało mi życie. Zmagałem się z fromIntegral (ceiling (int1 / int2))innymi rzeczami - z których żadna nie dała mi z powrotem Int, ale ta się udało.
MuffinTheMan
10
divzaokrągla w kierunku ujemnej nieskończoności, a nie zera.
Lacuno
1

Oto, co zrobiłem, aby stworzyć własne:

quot' a b
         | a<b = 0  -- base case
         | otherwise = 1 + quot' a-b b
Jacob Stewart
źródło
2
Niezłe ćwiczenie, ale bezużyteczne w produkcji. Na dużych liczbach jest wolny (czas liniowy) i zajmuje dużo pamięci (nie jest rekurencyjny). W przypadku liczb ujemnych jest albo błędna ( a<0), albo nigdy się nie kończy ( b<0).
Ruud Helderman