Тип класса Интеграл имеет две операции quot и div, однако в отчете о языке Haskell 2010 не указано, что они должны делать. Предполагая, что div является интегральным делением, что означает quot по-другому или какова цель quot? Когда вы используете один, а другой?
Интегральные операторы quot vs. div
Ответ 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 - "целочисленное деление, усеченное в сторону отрицательной бесконечности".