打印非常大的数字

时间:2016-08-31 21:46:03

标签: haskell

我开始学习Haskell,我不明白会发生什么:我有一个非常简单的代码:

import System.IO
import Control.Monad

fact n = product [1..n]

main :: IO ()
main = do
    input_line <- getLine
    let m = read input_line :: Int
    print (fact m)
    return ()

在ghci中,当我尝试

*Main> :load "fact.hs"
[1 of 1] Compiling Main             ( fact.hs, interpreted )
Ok, modules loaded: Main.
*Main> main
4500
0

但是

*Main> fact 4500
2274299510944531831673.....

我错过了什么? 谢谢你的任何解释。

1 个答案:

答案 0 :(得分:7)

chrome://extensions/的类型为fact。在Num a => a -> a中,您将其应用于main,您宣布为m。因此Int的结果将是fact,其间的所有计算都将使用Int来完成。 Int是固定宽度的整数,不能表示大的数字,导致溢出,从而导致错误的结果。

在您第二次尝试时,您将Int应用于fact,而未指定您希望4500的类型。在这种情况下,Haskell使用默认数字类型,即4500。与Integer不同,Int可以表示任意大小的整数,因此代码可以正常工作。

如果你Integer,你会得到与第一次相同的错误结果。同样,如果您在fact 4500 :: Int而不是:: Integer中使用main(或将其关闭,以便再次使用默认值¹),您将获得正确的结果。

¹请注意,这会产生警告。在GHCi或小型测试程序之外,通常优先明确注释类型而不是依赖于默认规则。