2011-08-17 10 views
4

私はTerminalからghciを実行しています。私のソースファイルでHaskellの異常な問題

が、私は

factorial :: Int -> Int 
factorial n = product [1 .. n] 

を定義し、私はこれを実行すると、私は13未満、任意の数のために

factorial 13 = 1932053504 

product [1 .. 13] = 6227020800 

結果を取得し、結果は正しいです。しかしながら、12以上の任意の数については、2つの結果は一致しない。私は、この関数の再帰定義した場合

また:

factorial' :: Int -> Int 
factorial' 0 = 1 
factorial' (n + 1) = (n + 1) * factorial' n 

を私はまだあなたがここで何が起きているか理解していれば、それは非常に参考になる

factorial' 13 = 1932053504 

を取得します。ありがとう

+2

ところでをこれはポリモーフィックである可能性がありますが、とりわけInteger型を選択するデフォルトシステムを使用します。だからこそ、 'product [1..13]'は異なるタイプのものです。 –

+0

その隣にあるチェックマークをクリックすると、その答えを受け入れることを忘れないでください。 – rampion

答えて

24

Intのドキュメントによると:A fixed-precision integer type with at least the range [-2^29 .. 2^29-1]factorial関数は、あふれているIntを使用するように型指定されています。我々は(単にGHCiの中productを使用してから)は、第2の解答の種類をチェックアウトする場合は今、我々はそれがタイプIntegerであることを参照してください。

Prelude> let a = product [1 .. 13] 
Prelude> :t a 
a :: Integer 

Integerは無制限であり、従って、このような大きなを保持することができますあふれずに

6

間違った種類があります。どこかの周りIntラップ、あなたが無制限の整数値についてInteger必要があります(^ 31おそらく2):Haskellは発現のための具体的なタイプを必要とするときに注意、

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

ありがとう、これはまさに問題でした。 – user898033

+0

2^29-1までサポートすることが保証されています – newacct