Посмотрите на класс Collections
, в частности shuffle(...)
.
Много языков имеют оператор "модификации" или "%", который дает остаток после деления с усечением к 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
следуют за этим поведением.
Это не точно ответ на Ваш вопрос, но в GHC на x86, quotRem на Интервале скомпилирует вниз в единственную машинную команду, тогда как 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.