#haskell
#хаскелл
Вопрос:
Тип class Integral содержит две операции quot
и div
, однако в отчете о языке Haskell 2010 не указано, что они должны делать. Предполагая, что div
это целочисленное деление, что делает quot
по-другому или какова цель quot
? Когда вы используете один, а когда другой?
Комментарии:
1. Это кажется многообещающей ссылкой: cdsmith.wordpress.com/2007/06/02 /…
Ответ №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
функция соответствует машинной инструкции на современных машинах, поэтому она несколько более эффективна.
Комментарии:
1. 1 за обсуждение того, когда вы могли бы предпочесть одно другому
2. или, что эквивалентно, результат
mod
имеет тот же знак, что и делитель, в то время как результатrem
имеет тот же знак, что и делимое3. Спасибо за ответ, особенно за упоминание абзаца в HR. Я смотрел только в главе 9.
4. Я разработал это как английское предложение, чтобы помочь мне разобраться в этом. Я полагаю, что это описывает истину для обоих уравнений; изменение значения определяется тем, что подразумевается под «частным» (т. Е. используется ли семантика quot или div). Здесь говорится: «Остаток представляет собой разницу между делимым и произведением частного на делитель».
Ответ №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
— «целочисленное деление, усеченное до отрицательной бесконечности».