Интегральные операторы quot vs. div
Тип класса Integral имеет две операции quot
а также div
Тем не менее, в Языковом отчете на Haskell 2010 не указано, что они должны делать. При условии, что div
является интегральным делением, что делает quot
иначе, или какова цель quot
? Когда вы используете один, а когда другой?
2 ответа
Чтобы процитировать раздел 6.4.2 из отчета на Haskell:
quot
, rem
, div
, а также mod
Методы класса удовлетворяют этим законам, если y не равен нулю:
(x `quot` y)*y + (x `rem` y) == x
(x `div` y)*y + (x `mod` y) == x
quot
целочисленное деление усекается до нуля, а результат div
усекается до отрицательной бесконечности.
div
функция часто является более естественной для использования, тогда как quot
Функция соответствует машинной инструкции на современных машинах, поэтому она несколько более эффективна.
Они ведут себя по-разному, когда имеют дело с отрицательными числами. Рассматривать:
Hugs> (-20) `divMod` 3
(-7,1)
Hugs> (-20) `quotRem` 3
(-6,-2)
Вот, -7 * 3 + 1 = -20
а также -6 * 3 + (-2) = -20
, но два способа дают вам разные ответы.
Также смотрите здесь: http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html
Определение для quot
является "целочисленным делением, усеченным до нуля", тогда как определение для div
является "целочисленным делением, усеченным до отрицательной бесконечности".