在追加功能下会发生什么?

时间:2013-05-18 09:53:27

标签: functional-programming ocaml ml

我在OCaml中获得了append函数的实现,但它似乎让我感到困惑

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

在这种情况下fun y的目的是什么?

2 个答案:

答案 0 :(得分:3)

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

fun y -> yappend在第一个列表为空时返回的函数。如果你考虑一下,这是有道理的。如果第一个列表为空,则第二个列表将保持不变。换句话说,返回的函数与身份函数(专用于应用于列表)完全没有区别。

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

答案 1 :(得分:2)

如果你不喜欢fun,你可以像这样重写这个功能

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