2011-08-17 74 views
4

我從終端運行ghci。Haskell不尋常的問題

在我的源文件中,我定義

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

當我運行它,我得到的結果

factorial 13 = 1932053504 

product [1 .. 13] = 6227020800 

對於任何數量小於13,結果是正確的。但是,對於任何大於或等於12的數字,這兩個結果不一致。

另外,如果我定義這個函數的遞歸:

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),我們看到它是Integer類型:

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

Integer是無界的,所以能保持這麼大的數字沒有溢出。

6

你打錯類型:大概在他Int包裹(大概2^31),你需要Integer無限的整數值:

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

謝謝,這正是問題所在。 – user898033

+0

它只能保證支持2^29-1 – newacct