f :: Integer -> Integer -> [Integer]
f i n = n : f (i+2) (n+i)
有人可以向我解释它的作用。我知道它返回 [0,1,4,9,16..] 但我不明白如何以及是什么n : f
意思
:
是 "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 和其他函数式编程语言时,您会逐渐熟悉这个概念。
您问题中的代码什么都不做,因为它包含类型错误和语法错误。
f :: Integer -> Integer --> [Integer]
从突出显示的最后一点可以看出,最后一位是注释,因为--
在 Haskell 中开始注释。结果,声明的类型f
is 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)
.