所以我注意到,在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