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

cod*_*441 9 haskell hugs

f :: Integer -> Integer -> [Integer]
f i n = n : f (i+2) (n+i)
Run Code Online (Sandbox Code Playgroud)

谁能向我解释它的作用.我知道它返回[0,1,4,9,16 ..],但我不明白如何和n : f意味着什么

Ric*_*ook 10

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

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

f 1 0 = 0 : f 3 1
Run Code Online (Sandbox Code Playgroud)

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

f 3 1 = 1 : f 5 4
Run Code Online (Sandbox Code Playgroud)

ie f 3 1是创建一个由1头部和f 5 4尾部返回的列表组成的新列表的结果.

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

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


sep*_*p2k 5

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

f :: Integer -> Integer --> [Integer]
Run Code Online (Sandbox Code Playgroud)

从突出显示的最后一位是注释,因为--在Haskell中启动注释.因此,声明的类型fInteger -> Integer,这是错误的.为了解决这个问题的变化-->->.

f i n = n : f (i+2) (n+i]
Run Code Online (Sandbox Code Playgroud)

在这里你有一个开放(然后关闭].显然这是错的.为了解决这个问题的变化(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).