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