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

有人可以向我解释它的作用。我知道它返回 [0,1,4,9,16..] 但我不明白如何以及是什么n : f意思

4

2 回答 2

10

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

f 1 0通过如下评估来检查此函数的行为:

f 1 0 = 0 : f 3 1

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

f 3 1 = 1 : f 5 4

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

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

至于第一行,f :: Integer -> Integer -> [Integer],这表示这f是一个接受两个整数 ( Integer -> Integer) 并返回整数列表 ( [Integer]) 的函数。严格来说,f接受一个整数 ( Integer) 并返回另一个函数,该函数接受一个整数并返回一个整数列表 ( Integer -> [Integer]) 作为函数柯里化的结果。当您更深入地了解 Haskell 和其他函数式编程语言时,您会逐渐熟悉这个概念。

于 2011-01-04T01:36:11.827 回答
5

您问题中的代码什么都不做,因为它包含类型错误和语法错误。

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

从突出显示的最后一点可以看出,最后一位是注释,因为--在 Haskell 中开始注释。结果,声明的类型fis 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).

于 2011-01-04T01:41:35.617 回答