Разделите 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.
Антал Спектор-Забуски
5
+1 за div. С математической точки зрения лучше себя вести, quotкогда вокруг есть отрицательные числа.
Луки
Это было мне спасением. Я боролся и с fromIntegral (ceiling (int1 / int2))другими вещами - ни одно из них не вернуло мне Int, но это помогло.
MuffinTheMan
10
divокругляется к отрицательной бесконечности, а не к нулю.
Lacuno 01
1

Вот что я сделал, чтобы сделать свое собственное:

quot' a b
         | a<b = 0  -- base case
         | otherwise = 1 + quot' a-b b
Джейкоб Стюарт
источник
2
Красиво как упражнение, но бесполезно в производстве. На больших числах он медленный (линейное время) и требует большого объема памяти (не хвостовой рекурсии). Для отрицательных чисел это либо неверно ( a<0), либо никогда не заканчивается ( b<0).
Рууд