类型类Integral有两个操作
quot
和div
,然而在Haskell 2010语言报告中没有说明它们应该做什么。假设div
是整除,那么quot
有什么不同之处,或者quot
的目的是什么?什么时候使用其中一个,什么时候使用另一个?quot
和div
,然而在Haskell 2010语言报告中没有说明它们应该做什么。假设div
是整除,那么quot
有什么不同之处,或者quot
的目的是什么?什么时候使用其中一个,什么时候使用另一个?引用来自Haskell报告的6.4.2节:
如果y非零,则quot
,rem
,div
和mod
类方法满足这些规律:
(x `quot` y)*y + (x `rem` y) == x
(x `div` y)*y + (x `mod` y) == x
quot
是向零取整的整数除法,而 div
的结果是向负无穷取整。
div
函数通常更自然一些,而 quot
函数对应于现代计算机上的机器指令,因此效率略高一些。
mod
的结果与除数的符号相同,而 rem
的结果与被除数的符号相同。 - newacct当处理负数时,这两个表现不同。考虑以下情况:
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
的定义是“整数除法向负无穷大取整”。