具有阶乘的haskell分段故障

时间:2013-01-20 01:09:29

标签: 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

有没有人知道为什么会发生这种情况?

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提及:

  • 更具体地说,SegmentationFault是一种类型不安全的语言拼写DoNotUnderstand。在像Haskell这样的类型安全的静态类型语言中,你不应该看到段错误。

是否与IO monad有关?

2 个答案:

答案 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

它会起作用。我不完全明白为什么。