带阶乘的haskell分段错误

带阶乘的haskell分段错误,haskell,segmentation-fault,Haskell,Segmentation Fault,有人知道为什么会这样吗 fac 10000有效 在OS X 10.8.2上运行 嗯,所以从文件加载: 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 ... don

有人知道为什么会这样吗

fac 10000
有效

在OS X 10.8.2上运行

嗯,所以从文件加载:

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::Int->Int

对于
fac 100000
,返回
0
。我本以为(就像约翰一样)会有一个错误

提到:

  • 更具体地说,SegmentationFault是一种类型不安全语言拼写无法理解的方式。在Haskell这样的类型安全静态类型语言中,您不应该看到segfaults

这与IO单子有关吗?

给它一个类型签名

fac::Integer->Integer


它会起作用的。但我不完全理解原因。

通过快速测试,这似乎是由于
产品
不严格造成的,是一连串的恶作剧造成的

在序言中,
产品
的定义如下:

fac :: Integer -> Integer
fac 0 = 1
fac n = product [1..n]
如果在ghci中,则将其定义为:

product = foldl (*) 1
那么它应该会起作用。我怀疑,当您指定类型签名时,可能正在进行一些优化,而这些优化在其他情况下是不存在的。。。但我还没有深入研究


顺便说一句,你不需要让fac 0=1这一行。

如果你要投否决票,请至少解释一下原因。我不确定这里是否有足够的信息来诊断问题。这完全属于“不应该发生”的范畴,因此您的系统中发生了一些非常奇怪的事情。
fac 100000::Integer
在os x上给出了一个456574位数字
fax 100000::Int
0::Int
,因为,粗略地说,它是2^32(或2^64)的倍数。像这样的例子很可能会导致堆栈溢出,但它绝对不会出错……这可能是OSX上的一个错误,也可能是您的安装。这应该永远不会出错,而且在这里可以工作(当然,打印这个数字需要一段时间)
fac 100000
甚至不足以由于懒惰而导致堆栈溢出。如果您提供类型签名
fac::Int->Int
,是否有效?我怀疑这也会出错。@JohnL使用
fac::Int->Int
实际上会为
fac 100000返回
0
> :m + Data.List
> let product = foldl' (*) 1
> let fac n = product [1..n]