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

Из отчета haskell:

Методы classа quot, rem, div и mod удовлетворяют этим законам, если y отличен от нуля:

(x `quot` y)*y + (x `rem` y) == x (x `div` y)*y + (x `mod` y) == x 

– это целочисленное деление, усеченное к нулю, а результат div усечен в сторону отрицательной бесконечности.

Например:

 Prelude> (-12) `quot` 5 -2 Prelude> (-12) `div` 5 -3 

Каковы некоторые примеры того, где разница между тем, как результат усечен?

    На многих языках есть оператор «mod» или «%», который дает остаток после деления с усечением в направлении 0; например C, C ++ и Java, и, возможно, C #, скажут:

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

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

    Haskell’s div и mod , а затем Python’s и т. Д. Следуют соглашению математиков (по крайней мере теоретиков числа) при усечении деления (не в направлении 0 – к отрицательной бесконечности), так что остаток всегда неотрицателен. Таким образом, в Python,

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

    Это и поведение Хаскелла, и mod .

    Это не совсем ответ на ваш вопрос, но в GHC на x86 quotRem on Int скомпилируется до одной машинной команды, в то время как divMod выполняет немного больше работы. Поэтому, если вы находитесь в критическом критически важном разделе и работаете только с положительными номерами, quotRem – это путь.

    Простой пример, когда это имеет значение, – это тестирование, если целое число четное или нечетное.

     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.

    Давайте будем гением компьютера.