Когда различие между quotRem и divMod полезный?

Посмотрите на класс Collections , в частности shuffle(...).

42
задан grom 4 December 2008 в 16:29
поделиться

3 ответа

Много языков имеют оператор "модификации" или "%", который дает остаток после деления с усечением к 0; например, C, C++, и Java, и вероятно C#, сказал бы:

(-11)/5 = -2
(-11)%5 = -1
5*((-11)/5) + (-11)%5 = 5*(-2) + (-1) = -11.

Haskell quot и rem предназначаются для подражания этому поведению. Я могу предположить, что совместимость с выводом некоторой программы C могла бы быть желательной в некоторой изобретенной ситуации.

Haskell div и mod, и впоследствии Python / и %, следует соглашению математиков (по крайней мере, теоретики числа) во всегда усечении вниз подразделение (не к 0 - к отрицательной бесконечности) так, чтобы остаток был всегда неотрицательным. Таким образом в Python,

(-11)/5 = -3
(-11)%5 = 4
5*((-11)/5) + (-11)%5 = 5*(-3) + 4 = -11.

Haskell div и mod следуют за этим поведением.

36
ответ дан grom 23 September 2019 в 14:03
поделиться

Это не точно ответ на Ваш вопрос, но в GHC на x86, quotRem на Интервале скомпилирует вниз в единственную машинную команду, тогда как divMod действительно вполне немного больше работает. Таким образом, если Вы находитесь в критическом по отношению к скорости разделе и работающий над положительными числами только, quotRem является способом пойти.

25
ответ дан luqui 23 September 2019 в 14:03
поделиться

Простой пример, где это имело бы значение, тестирует, если целое число даже или нечетно.

let buggyOdd x = x `rem` 2 == 1
buggyOdd 1 // True
buggyOdd (-1) // False (wrong!)

let odd x = x `mod` 2 == 1
odd 1 // True
odd (-1) // True

Примечание, конечно, Вы могли постараться не думать об этих проблемах, просто определив нечетный таким образом:

let odd x = x `rem` 2 /= 0
odd 1 // True
odd (-1) // True

В целом, просто помните что, для y > 0, x mod y всегда возврат что-то >= 0 в то время как x rem y возвраты 0 или что-то вроде того же знака как x.

6
ответ дан namin 23 September 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: