You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell负整数除法规则解析:GHCI中div、mod计算结果存疑

Haskell中负整数的div和mod规则详解

你遇到的这个结果其实是Haskell里整数除法和取模遵循的向负无穷取整规则导致的,我给你一步步拆解清楚:

核心规则

Haskell的div(整数除法)和mod(取模)严格遵守两个关键原则:

  1. 除法向负无穷取整:和我们小学学的“向零取整”不同,Haskell会把除法结果往负无穷的方向取整,而不是直接截断小数部分。
  2. 恒等式约束:对于任意整数a和非零整数b,必须满足:
    a = b * div a b + mod a b
    
    同时,mod的结果符号永远和除数b的符号一致。

你的例子拆解

我们用这两个规则来计算你提到的div 4 (-3)和mod 4 (-3):

  1. 计算div 4 (-3):
    数学上4除以-3等于-1.333...,按照向负无穷取整的规则,我们要找比-1.333更小的整数,也就是-2,所以div 4 (-3) = -2。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:04:31