Интегральные операторы 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 является "целочисленным делением, усеченным до отрицательной бесконечности".

Другие вопросы по тегам