GHCi, version 7.4.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> let fac 0 = 1
Prelude> let fac n = product [1..n]
Prelude> fac 100000
Segmentation fault: 11
有没有人知道为什么会发生这种情况?
fac 10000
有效
在OS X 10.8.2上运行
嗯,所以从文件加载:
fac :: Integer -> Integer
fac 0 = 1
fac n = product [1..n]
运行。
也很有意思的是使用
fac :: Int -> Int
为0
返回fac 100000
。我本来期望(就像JohnL一样)是一个错误。
this site提及:
是否与IO monad有关?
答案 0 :(得分:2)
从快速测试来看,它似乎是由于product
不严格,并且thunk链导致了错误。
在前奏中,product
定义为:
product = foldl (*) 1
如果在ghci中,则将其定义为:
> :m + Data.List
> let product = foldl' (*) 1
> let fac n = product [1..n]
然后它应该工作。我怀疑当你指定类型签名时,可能会有一些优化正在进行中,否则就不存在......但是还没有挖掘它。
顺便说一句,您不需要let fac 0 = 1
行。
答案 1 :(得分:1)
给它一个类型签名
fac :: Integer -> Integer
它会起作用。我不完全明白为什么。