类型类Integral有两个操作quot
和div
,但在Haskell 2010语言报告中没有指定他们应该做什么。假设div
是整数除法,quot
的不同之处是什么,quot
的目的是什么?你什么时候使用,另一个?
答案 0 :(得分:98)
引用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
函数对应于现代机器上的机器指令,因此效率更高。
答案 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
的定义是“整数除法被截断为负无穷大”。