具有阶乘的haskell分段故障

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

返回0fac 100000.我本来期望(就像JohnL一样)是一个错误.

本网站提到:

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

这与IO monad有关吗?

Ste*_*eve 2

从快速测试来看,这似乎是由于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线。