Functional programming 在append函数下面会发生什么?

Functional programming 在append函数下面会发生什么?,functional-programming,ocaml,ml,Functional Programming,Ocaml,Ml,我在OCaml中得到了一个append函数的实现,但对我来说似乎很困惑 let rec append = function | [] -> fun y -> y | h :: t -> fun y -> h :: (append t y) 在这种情况下,fun y的用途是什么?如果您不喜欢fun,可以这样重写函数 let rec append x y = match x with | [] -> y | h :: t -> h :: append t y

我在OCaml中得到了一个
append
函数的实现,但对我来说似乎很困惑

let rec append = function
| [] -> fun y -> y
| h :: t -> fun y -> h :: (append t y)

在这种情况下,
fun y
的用途是什么?

如果您不喜欢
fun
,可以这样重写函数

let rec append x y = match x with
| [] -> y
| h :: t -> h :: append t y

append
的类型是
'a list->'a list->'a list
。您可以将其视为一个函数,它接受两个列表并返回一个列表。但是(正如OCaml中惯用的那样)该函数是使用定义的。因此,在基本级别,
append
获取第一个列表,并返回类型为
“列表->”的函数。返回的函数获取第二个列表,并将第一个列表作为前缀(返回结果)

funy->y
是当第一个列表为空时
append
返回的函数。如果你仔细想想,这是有道理的。如果第一个列表为空,则第二个列表将原封不动地返回。换句话说,返回的函数与标识函数(专门用于应用于列表)没有任何区别

第二种情况返回值
funy->h::(append t y)
。这是相似的,但有点复杂。返回的函数需要进行一些实际的追加。它通过(递归地)将提供的第二个列表(
y
)附加到第一个列表的尾部(
t
),然后将第一个列表的头(
h
)添加到该列表的前面来实现