Разделите 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).
Рууд
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.