gpt4 book ai didi

haskell 阶乘段错误

转载 作者:行者123 更新时间:2023-12-02 02:06:15 24 4
gpt4 key购买 nike

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

对于 fac 100000 返回 0。我会预料到(就像 JohnL 一样)会出现错误。

this site提及:

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

这与 IO monad 有关吗?

最佳答案

从快速测试来看,这似乎是由于 product 不严格造成的,并且 thunk 链导致了错误。

在序言中,product 定义为:

product = foldl (*) 1

如果在 ghci 中,您可以将其定义为:

> :m + Data.List
> let product = foldl' (*) 1
> let fac n = product [1..n]

然后它应该可以工作。我怀疑当您指定类型签名时,也许一些优化正在启动,否则这些优化是不存在的......但还没有深入研究它。

顺便说一句,您不需要 let fac 0 = 1 行。

关于haskell 阶乘段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14420712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com