beo*_*ver 6 haskell segmentation-fault
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
Run Code Online (Sandbox Code Playgroud)
有没有人知道为什么会发生这种情况?
fac 10000
作品
在OS X 10.8.2上运行
嗯,所以从文件加载:
fac :: Integer -> Integer
fac 0 = 1
fac n = product [1..n]
Run Code Online (Sandbox Code Playgroud)
运行.
也很有意思的是使用
fac :: Int -> Int
返回0
的fac 100000
.我本来期望(就像JohnL一样)是一个错误.
本网站提到:
这与IO monad有关吗?
从快速测试来看,这似乎是由于product
不严格而引起的,并且 thunk 链导致了错误。
在序言中,product
定义为:
product = foldl (*) 1
Run Code Online (Sandbox Code Playgroud)
如果在 ghci 中,您可以将其定义为:
> :m + Data.List
> let product = foldl' (*) 1
> let fac n = product [1..n]
Run Code Online (Sandbox Code Playgroud)
那么它应该可以工作。我怀疑当您指定类型签名时,也许一些优化正在启动,否则这些优化是不存在的......但还没有深入研究它。
顺便说一句,你不需要这条let fac 0 = 1
线。