我开始学习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.....
我错过了什么? 谢谢你的任何解释。
答案 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或小型测试程序之外,通常优先明确注释类型而不是依赖于默认规则。