Интегральные операторы» против div

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