所以我注意到,在n = 20之後,由於Int類型的有限工作範圍,在LearnYouAHaskell(下面)中給出的階乘函數變成了胡扯。使函數的類型取決於輸入
factorial :: Int -> Int
factorial 0 = 1
factorial n * factorial (n-1)
使用factorial :: Integer -> Integer
修復很好的問題,但它使我想起這個問題。據推測Integer比Int要慢一些,所以理想情況下(我知道我在這裏捏一分錢)我希望我的階乘函數只在輸入大於20時使用Integer,並保留較小數字的Int->Int
類型。似乎應該有一個優雅的解決方案,使用if-then-else或守衛,但仍然運行到語法胡椒(錯誤消息)
在GHC中,我們有['Integer'](http://hackage.haskell.org/package/integer-gmp-1.0.0.0/docs/ GHC-Integer-GMP-Internals.html#t:Integer)恰好是一個和類型,小值使用更高效的表示形式。因此,在上面再增加一筆錢可能會讓事情變得更糟。 – chi
我寧願寫'selectiveFactorial :: Int - > Integer; selectiveFactorial i |我<20 = fromIntegral(階乘i)|否則=階乘(來自整體i)'。 – user3237465