Интегральные операторы quot vs. div
Тип classа Интеграл имеет две операции quot
и div
, но в Haskell 2010 Language Report не указано, что они должны делать. Предполагая, что div
является интегральным делением, что иначе quot
, или какова цель quot
? Когда вы используете один, а другой?
- Кабал не устанавливает зависимости при необходимости профилирования библиотек?
- Удаление дубликатов из списка в Haskell
- Что (f.). g означает в Haskell?
- Равный (=) символ левой стрелки (<-) в символе haskell
- Является ли оператор monad bind (>> =) ближе к функциональному составу (цепочке) или приложению функции?
- Как составить `не` с функцией произвольной arity?
- Haskell GHC: какова временная сложность совпадения шаблона с конструкторами N?
- Какое преимущество дает Монад нам по Прикладной?
Процитировать раздел 6.4.2 из отчета Haskell:
Методы classа quot
, rem
, div
и mod
удовлетворяют этим законам, если y отличен от нуля:
(x `quot` y)*y + (x `rem` y) == x (x `div` y)*y + (x `mod` y) == x
– это целочисленное деление, усеченное к нулю, а результат 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
является «целым делением, усеченным в сторону отрицательной бесконечности».