Haskell负整数除法规则解析:GHCI中div、mod计算结果存疑
Haskell中负整数的
div和mod规则详解 你遇到的这个结果其实是Haskell里整数除法和取模遵循的向负无穷取整规则导致的,我给你一步步拆解清楚:
核心规则
Haskell的div(整数除法)和mod(取模)严格遵守两个关键原则:
- 除法向负无穷取整:和我们小学学的“向零取整”不同,Haskell会把除法结果往负无穷的方向取整,而不是直接截断小数部分。
- 恒等式约束:对于任意整数
a和非零整数b,必须满足:
同时,a = b * div a b + mod a bmod的结果符号永远和除数b的符号一致。
你的例子拆解
我们用这两个规则来计算你提到的div 4 (-3)和mod 4 (-3):
- 计算
div 4 (-3):
数学上4除以-3等于-1.333...,按照向负无穷取整的规则,我们要找比-1.333更小的整数,也就是-2,所以div 4 (-3) = -2。 - 计算
mod 4 (-3):
代入恒等式:4 = (-3) * div 4 (-3) + mod 4 (-3)
把div的结果代入:4 = (-3)*(-2) + mod结果
计算得:4 = 6 + mod结果,所以mod结果 = 4 - 6 = -2,这和你在GHCI里看到的结果一致,而且结果符号和除数-3相同,符合规则。
额外例子巩固理解
再举几个例子帮你加深印象:
div (-4) 3:-4/3≈-1.333,向负无穷取整为-2;mod (-4) 3代入恒等式得-4 = 3*(-2)+mod→mod=2(和除数3同号)div (-4) (-3):-4/-3≈1.333,向负无穷取整为1;mod (-4) (-3)代入得-4=(-3)*1+mod→mod=-1(和除数-3同号)
和其他语言的差异
这里要提一句,不同语言的整数除法规则可能不同:比如Python和Haskell一样是向负无穷取整,但C/C++、Java等语言是向零取整,这也是为什么你可能会对这个结果感到困惑——毕竟我们平时更习惯向零取整的逻辑,但Haskell选择了数学上更一致的向负无穷取整规则。
内容的提问来源于stack exchange,提问作者wxw
相关产品推荐
相关产品推荐

