有人可以向我解释下面的Haskell表达式

时间:2011-01-04 01:33:07

标签: haskell hugs

f :: Integer -> Integer -> [Integer]
f i n = n : f (i+2) (n+i)

有人可以向我解释它的作用。我知道它返回[0,1,4,9,16 ...]但我不明白n : f的含义和方式

2 个答案:

答案 0 :(得分:10)

:是“cons”运算符并构造一个新列表,其头部是运算符左侧的值,其尾部是运算符右侧的值。因此0 : [1, 2, 3]是列表[0, 1, 2, 3]

通过评估f 1 0,检查此功能的行为,如下所示:

f 1 0 = 0 : f 3 1

即。 f 1 0是创建一个新列表的结果,该列表由头部的0f 3 1返回的列表组成。同样,f 3 1如下:

f 3 1 = 1 : f 5 4

即。 f 3 1是创建一个新列表的结果,该列表由头部的1f 5 4返回的列表组成。

因此,该函数递归地构建一个列表。此外,它是无限尾递归的(因为它没有终止条件),因此会产生无限长的列表。

对于初始行f :: Integer -> Integer -> [Integer],这表明f是一个带有两个整数(Integer -> Integer)的函数,并返回一个整数列表([Integer]) 。严格来说,f采用整数(Integer)并返回另一个采用整数的函数,并返回一个整数列表(Integer -> [Integer])作为函数currying的结果。当您深入了解Haskell和其他函数式编程语言时,这是一个您将熟悉的概念。

答案 1 :(得分:5)

您的问题中的代码不执行任何操作,因为它包含类型错误和语法错误。

f :: Integer -> Integer --> [Integer]

正如您在突出显示时可以看到的最后一位是注释,因为--在Haskell中启动注释。因此,声明的f类型为Integer -> Integer,这是错误的。要将此更改-->修改为->

f i n = n : f (i+2) (n+i]

这里有一个开头(,然后是一个结束]。显然这是错的。要将此更改(n+i]修改为(n+i)

现在已经完成了,这就是固定代码的作用:

:是列表类型的构造函数。 x : xs是以x为首,xs为尾的列表。 n : f (i+2) (n+i)被解析为n : (f (i+2) (n+i))(而不是(n : f) (i+2) (n+1),因为您似乎相信)。因此,它会创建一个列表,其头部为n,其尾部是f (i+2) (n+1)的结果。