我正在从终端运行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
如果您了解这里发生的事情,那将非常有帮助。感谢
答案 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]