В чем именно разница между mod
и rem
в Haskell?
Оба, кажется, дают одинаковые результаты
*Main> mod 2 3
2
*Main> rem 2 3
2
*Main> mod 10 5
0
*Main> rem 10 5
0
*Main> mod 1 0
*** Exception: divide by zero
*Main> rem 1 0
*** Exception: divide by zero
*Main> mod 1 (-1)
0
*Main> rem 1 (-1)
0
mod
улус ==rem
айндер.div
иquot
Ответы:
Они не то же самое, когда второй аргумент отрицательный:
источник
rem
иmod
в нем, и это был ответ.rem
это самый быстрый.Да, эти функции действуют по-другому. Как определено в официальной документации :
quot
целочисленное деление, усеченное до нуляrem
- целочисленный остаток, удовлетворяющий:div
целочисленное деление, усеченное до отрицательной бесконечностиmod
является целочисленным модулем, удовлетворяющим:Вы действительно можете заметить разницу, если вы используете отрицательное число в качестве второго параметра, а результат не равен нулю:
источник
mod
иrem
ассоциация сильнее, чем(-)
. Я отредактировал ваш комментарий, так как не могу поместить в него многострочный материал.(-5) `mod` 3 == 1
Практически:
Если вы знаете , оба операнда положительны, обычно вы должны использовать
quot
,rem
илиquotRem
для повышения эффективности.Если вы не знаете, что оба операнда положительны, вы должны подумать о том, как должны выглядеть результаты. Вы, наверное, не хотите
quotRem
, но, возможно, и не хотитеdivMod
. Этот(x `div` y)*y + (x `mod` y) == x
закон очень хорош, но округление деления до отрицательной бесконечности (деление в стиле Кнута) часто менее полезно и менее эффективно, чем обеспечение этого0 <= x `mod` y < y
(евклидово деление).источник
Если вы хотите только проверить делимость, вы всегда должны использовать
rem
.По сути
x `mod` y == 0
эквивалентноx `rem` y == 0
, ноrem
работает быстрееmod
.источник