关于haskell:积分运算符quot与div

Integral operators quot vs. div

类型类积分有两个操作:quotdiv,但是在Haskell2010语言报告中没有规定它们应该做什么。假设div是整数除法,quot有什么不同,或者quot的目的是什么?你什么时候用一个,什么时候用另一个?


引用Haskell报告第6.4.2节:

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

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

quot是向零截断的整数除法,而div的结果则是向负无穷大截断。

div功能通常更自然,而quot功能与现代机器上的机器指令相对应,因此效率更高。


在处理负数时,这两种情况不同。考虑:

1
2
3
4
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的定义是"整除向负无穷截断"。