f :: Integer -> Integer -> [Integer]
f i n = n : f (i+2) (n+i)
有人可以向我解释它的作用。我知道它返回[0,1,4,9,16 ...]但我不明白n : f
的含义和方式
答案 0 :(得分:10)
:
是“cons”运算符并构造一个新列表,其头部是运算符左侧的值,其尾部是运算符右侧的值。因此0 : [1, 2, 3]
是列表[0, 1, 2, 3]
。
通过评估f 1 0
,检查此功能的行为,如下所示:
f 1 0 = 0 : f 3 1
即。 f 1 0
是创建一个新列表的结果,该列表由头部的0
和f 3 1
返回的列表组成。同样,f 3 1
如下:
f 3 1 = 1 : f 5 4
即。 f 3 1
是创建一个新列表的结果,该列表由头部的1
和f 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)
的结果。