Разделить Int на Int и вернуть Int

Мне нужна функция, которая получает два Int (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?


person demas    schedule 05.12.2010    source источник


Ответы (2)


Почему бы просто не использовать quot?

quot a b

представляет собой целое частное целых чисел a и b, усеченное в сторону нуля.

person Pointy    schedule 05.12.2010
comment
Или a `quot` b для любителей инфиксов (вау, вы действительно можете экранировать обратные кавычки в обратных кавычках с помощью обратной косой черты?). - person ; 05.12.2010
comment
Также a `div` b; если я правильно помню, quot усекается (как хотел демас), а div округляется до нуля. Итак, (-3) `quot` 4 == 0 и (-3) `div` 4 == -1. - person Antal Spector-Zabusky; 05.12.2010
comment
+1 за div. Более математически правильное поведение, quot — сука, когда вокруг отрицательные числа. - person luqui; 05.12.2010
comment
Это было спасением для меня. Я боролся с fromIntegral (ceiling (int1 / int2)) и другими вещами, ни одна из которых не вернула мне Int, но этот дал. - person MuffinTheMan; 16.11.2013
comment
div округляется до отрицательной бесконечности, а не до нуля. - person Lacuno; 01.04.2015

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

quot' a b
         | a<b = 0  -- base case
         | otherwise = 1 + quot' a-b b
person Jacob Stewart    schedule 09.02.2018
comment
Красиво как упражнение, но бесполезно в производстве. На больших числах он медленный (линейное время) и требует большого объема памяти (не хвостовой рекурсии). Для отрицательных чисел оно либо неверно (a<0), либо никогда не заканчивается (b<0). - person Ruud Helderman; 08.03.2019