积分算子的“quot”与“div”有什么区别?

61
类型类Integral有两个操作quotdiv,然而在Haskell 2010语言报告中没有说明它们应该做什么。假设div是整除,那么quot有什么不同之处,或者quot的目的是什么?什么时候使用其中一个,什么时候使用另一个?

1
这个链接看起来很有前途:http://cdsmith.wordpress.com/2007/06/02/learning-number-theory-and-haskell-the-division-algorithm/ - Stuart Golodetz
2个回答

120

引用来自Haskell报告的6.4.2节:

如果y非零,则quotremdivmod类方法满足这些规律:

(x `quot` y)*y + (x `rem` y) == x  
(x `div`  y)*y + (x `mod` y) == x

quot 是向零取整的整数除法,而 div 的结果是向负无穷取整。

div 函数通常更自然一些,而 quot 函数对应于现代计算机上的机器指令,因此效率略高一些。


7
+1 是讨论何时您可能更喜欢其中一个的意义。 - Stuart Golodetz
25
或者等价地说,mod 的结果与除数的符号相同,而 rem 的结果与被除数的符号相同。 - newacct
谢谢你的回答,特别是提到 HR 部分的段落。我只看了第九章。 - Ingo
我将其转化为英语句子以帮助我理解。我相信这描述了两个方程的真相;意义上的差异取决于“商”所指的含义(即使用quot或div语义)。下面是句子:“余数是被除数与商乘积之间的差。” - Evan Lenz

37

当处理负数时,这两个表现不同。考虑以下情况:

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 的定义是“整数除法向负无穷大取整”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接