6
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 一样)会出现错误。

这个网站提到:

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

它与 IO monad 有关吗?

4

2 回答 2

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条线。

于 2013-01-20T01:26:52.563 回答
1

通过给它一个类型签名

fac :: Integer -> Integer

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

于 2013-01-20T01:15:45.927 回答