Розділіть Int на Int і поверніть Int


79

Мені потрібна функція, яка отримує два Ints ( aі b) і повертається A/Bяк Int. Я впевнений, що A/Bце завжди буде цілим числом.

Ось моє рішення:

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

Але хочу знайти більш просте рішення. Щось на зразок цього:

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

Як я можу розділити Int на Int і отримати Int?

Відповіді:


140

Чому б просто не використовувати quot?

quot a b

є цілим числом цілих чисел a і b, усіченим до нуля.


7
Або a `quot` bдля любителів інфіксів (нічого собі, ви насправді можете уникнути зворотних зворотів, незначних зворотних знаків за допомогою зворотної риски?).

38
Також a `div` b; якщо я добре пам'ятаю, quotусікає (як деми хотіли) і divокругляє до нуля. Отже (-3) `quot` 4 == 0, і (-3) `div` 4 == -1.
Antal Spector-Zabusky

5
+1 за div. Більше математично вихований, quotце сука, коли навколо є від’ємні числа.
luqui

Це для мене врятувало життя. Я боровся з fromIntegral (ceiling (int1 / int2))іншими речами - жодне з яких не повернуло мені Int, але це дало .
MuffinTheMan

10
divобертається до негативної нескінченності, а не до нуля.
Лакуно,

1

Ось що я зробив, щоб зробити свій власний:

quot' a b
         | a<b = 0  -- base case
         | otherwise = 1 + quot' a-b b

2
Хороша вправа, але марна на виробництві. У великих числах це повільно (лінійний час) і має велику площу пам'яті (не рекурсивно). Для від’ємних чисел це неправильно ( a<0) або ніколи не закінчується ( b<0).
Рууд Хельдерман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.