2013-01-20 17 views
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 

これはなぜ起こっているのでしょうか?factorialでhaskellセグメント化エラーが発生する

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

実行:

fac 10000ので、ファイルからの読み込み、うーんOS X 10.8.2に

を実行している

に動作します。

も興味深いのは

fac :: Int -> Int

戻りfac 100000ため0を使用していることです。私は、(ちょうどJohnLと同じように)エラーが予想されます。

this siteは言及:

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

IOモナドとは何か?それが動作しますそれを型シグネチャ

fac :: Integer -> Integer

を与えることによって

+0

downvoteに行く場合は、少なくとも理由を説明してください。 – beoliver

+3

問題を診断するのに十分な情報がここにあるかどうかわかりません。これは「起こるべきではない」というカテゴリーにしっかりと入っているので、あなたのシステムでは非常に奇妙なことが起きています。 –

+0

'fac 100000 :: Integer'は、ここにos xの456574桁の番号を与えます。 'fax 100000 :: Int'は' 0 :: Int'です。なぜなら、それは少し粗悪なので、2^32(または2^64)の倍数です。 – applicative

答えて

2

クイックテストからは、productが厳密ではなく、サンクのチェーンが原因でエラーが発生しているように見えます。そして、それが動作するはず

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

:GHCiの中で、あなたが代わりとしてそれを定義した場合

product = foldl (*) 1 

:前奏曲で

は、productは以下のように定義されます。私は、あなたが型シグニチャを指定するとき、おそらくいくつかの最適化が蹴られていて、そうでなければ存在しないと思われます...しかし、それを掘り下げませんでした。

Btwの場合、let fac 0 = 1行は必要ありません。

+0

悪い' foldl' !!! – beoliver

1

。私はなぜそう思っているのか完全に理解していない。

+0

型シグネチャ 'fac :: Int - > Int'を渡すと動作しますか?私はそれもまたセグメンテーションするだろうと思う。 –

+0

'Fac :: Int - > Int'を使って@JohnLは' fac 100000'に '0'を返します – beoliver

関連する問題