积分运算符quot与div

时间:2011-11-13 11:08:41

标签: haskell

类型类Integral有两个操作quotdiv,但在Haskell 2010语言报告中没有指定他们应该做什么。假设div是整数除法,quot的不同之处是什么,quot的目的是什么?你什么时候使用,另一个?

2 个答案:

答案 0 :(得分:98)

引用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函数对应于现代机器上的机器指令,因此效率更高。

答案 1 :(得分:30)

当处理负数时,两者表现不同。考虑:

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的定义是“整数除法被截断为负无穷大”。