Интегральные операторы quot vs. div

Тип класса Интеграл имеет две операции quot и div, однако в отчете о языке Haskell 2010 не указано, что они должны делать. Предполагая, что div является интегральным делением, что означает quot по-другому или какова цель quot? Когда вы используете один, а другой?

Ответ 1

Чтобы процитировать раздел 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 соответствует машинной инструкции на современных машинах, поэтому она несколько эффективнее.

Ответ 2

Оба действуют по-разному, когда имеют дело с отрицательными числами. Рассмотрим:

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