Haskell的不寻常问题

时间:2011-08-17 06:10:49

标签: haskell

我正在从终端运行ghci。

在我的源文件中,我定义了

factorial :: Int -> Int
factorial n = product [1 .. n]

当我运行时,我得到了结果

factorial 13 = 1932053504

product [1 .. 13] = 6227020800

对于任何小于13的数字,结果都是正确的。但是,对于大于或等于12的任何数字,两个结果不一致。

此外,如果我以递归方式定义此函数:

factorial' :: Int -> Int
factorial' 0 = 1
factorial' (n + 1) = (n + 1) * factorial' n

我还是

factorial' 13 = 1932053504

如果您了解这里发生的事情,那将非常有帮助。感谢

2 个答案:

答案 0 :(得分:24)

根据Int的文档:A fixed-precision integer type with at least the range [-2^29 .. 2^29-1]。您输入的factorial函数使用的是Int,它会溢出。现在,如果我们查看第二个答案的类型(仅使用GHCi中的product),我们就会发现它的类型为Integer

Prelude> let a = product [1 .. 13]
Prelude> :t a
a :: Integer

Integer是无界限的,因此可以容纳如此大的数字而不会溢出。

答案 1 :(得分:6)

你有错误的类型:Int环绕某处(可能是2 ^ 31),你需要Integer来获得无限的整数值:

factorial :: Integer -> Integer
factorial n = product [1 .. n]