【发布时间】:2014-12-05 05:33:42
【问题描述】:
我最近开始在讲座中学习 Haskell,但是当我尝试找到进一步的解释以了解它在网上的工作原理时,我发现代码看起来完全不同。注意:我之前只学过 C,并且习惯了大多数格式相似的代码,看起来也很相似。
例如,在我的讲座中,一个数字的阶乘函数如下所示:
{-**********-}
fac :: Int -> Int
fac n
| n==0 = 1
| n>0 = n * fac (n-1)
{-**********-}
但是当我在网上看时,它看起来完全不同,而且要简单得多。例如:
factorial 1 = 1
factorial k = k * factorial (k-1)
谁能解释为什么我所学的代码更有效,特别是它说的地方
fac:: Int->Int
为什么这很重要?
【问题讨论】:
-
正如答案所指出的,这些是编写基本相同功能的不同方式。可能值得指出的是
fac和factorial的定义不是同一个函数,它们在应用于0时具有不同的含义。这里还有一些解决相同问题的方法(主要是一个笑话)willamette.edu/~fruehr/haskell/evolution.html -
@Cirdec 不错的链接。它可以很有教育意义:)
-
第一个效率较低,因为它进行了额外的毫无意义的比较 (
n>0)。 -
第一个对于小于零的数字是未定义的,将退出并出现错误。对于小于零的数字,第二个将进入无限循环。