*Test> ((3^40) `mod` 3) :: Int
2
*Test> ((3^40) `mod` 3)
0
为什么会这样?我正在使用GHCi 7.0.3。如果这不是一个错误,那么可以理解Integral / Int如何在haskell中工作的解释,或者说明解释的链接。
感谢。
答案 0 :(得分:13)
你只是超出了范围,3^40
太大了,甚至不适合64位int:
Prelude> 3^40 :: Int
-6289078614652622815
Prelude> 3^40 :: Integer
12157665459056928801
另一方面,Integer
类型是无限制的,无论多大都接受所有数字。在您的第二种情况下(您获得了0
结果),您得到了Integer
类型的推断。
答案 1 :(得分:2)
如果仅在模运算的上下文中使用取幂,请查看powerMod
包中的arithmoi
函数:
http://hackage.haskell.org/package/arithmoi
import Math.NumberTheory.Powers (powerMod)
test = powerMod 3 40 3
powerMod
会在计算取幂时减少结果,从而减少工作量。