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作品

OSX10.8.2で実行

うーん、ファイルからロードします:

fac :: Integer -> Integer
fac 0 = 1
fac n = product [1..n]

実行されます。

また興味深いのは、

fac :: Int -> Int

0に戻りますfac 100000。私は(JohnLと同じように)エラーを予期していました。

このサイトは言及します:

  • より具体的には、SegmentationFaultは、タイプが安全でない言語がDoesNotUnderstandを綴る方法です。Haskellのようなタイプセーフな静的型付け言語では、segfaultsは表示されません。

それはIOモナドと関係がありますか?

4

2 に答える 2

2

簡単なテストから、それは厳密ではないという事実によって引き起こされているようでproductあり、サンクの連鎖が障害を引き起こしています。

プレリュードで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 に答える