有人可以在Haskell中向我解释这个Integer模块化行为吗?

时间:2013-02-26 20:20:53

标签: haskell

*Test> ((3^40) `mod` 3) :: Int
2
*Test> ((3^40) `mod` 3)
0

为什么会这样?我正在使用GHCi 7.0.3。如果这不是一个错误,那么可以理解Integral / Int如何在haskell中工作的解释,或者说明解释的链接。

感谢。

2 个答案:

答案 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会在计算取幂时减少结果,从而减少工作量。