【发布时间】:2015-11-15 21:39:49
【问题描述】:
我是一个相对经验丰富的 Haskell 程序员,有几个小时的经验,所以答案可能很明显。
看完《A taste of Haskell》后,当 Simon 解释 append (++) 函数真正如何与它的参数一起工作时,我迷失了。
所以,here's the part where he talks about this。
首先,他说(++) :: [a] -> [a] -> [a] 可以理解为一个函数,它获取两个列表作为参数,并在最后一个箭头之后返回一个列表)。然而,他补充说实际上,会发生这样的事情:(++) :: [a] -> ([a] -> [a]),该函数只接受 一个 参数并返回一个函数。
我不确定返回的函数闭包如何获得第一个列表,因为它也需要一个参数。
在演示文稿的下一张幻灯片中,我们有以下实现:
(++) :: [a] -> [a] -> [a]
[] ++ ys = ys
(x:xs) ++ ys = x : (xs ++ ys)
如果我认为 (++) 接收两个参数并返回一个列表,那么这段代码连同递归就足够清晰了。
如果我们认为(++) 只接收一个参数并返回一个列表,ys从哪里来?返回的函数在哪里?
【问题讨论】:
-
查找currying:在大多数函数式编程语言中,没有函数接受多个参数这样的东西。 “二元函数”是一个技术上不正确的术语,它指的是一个函数采用 one 参数(“第一个”参数)并返回一个函数。这个返回的函数接受 一个 参数(“第二个”),最后返回结果。例如。
(++) [1,2]是一个函数,可以应用于[4,5]以产生[1,2,4,5]。
标签: function haskell recursion arguments operator-precedence