我在OCaml中获得了append
函数的实现,但它似乎让我感到困惑
let rec append = function
| [] -> fun y -> y
| h :: t -> fun y -> h :: (append t y)
在这种情况下fun y
的目的是什么?
答案 0 :(得分:3)
append
的类型为'a list -> 'a list -> 'a list
。您可以将此视为一个带有两个列表并返回列表的函数。但是(在OCaml中是惯用的)该函数是使用currying定义的。因此,在基本级别,append
获取第一个列表并返回类型为'a list -> 'a list
的函数。返回的函数获取第二个列表并将第一个列表作为前缀(返回结果)。
值fun y -> y
是append
在第一个列表为空时返回的函数。如果你考虑一下,这是有道理的。如果第一个列表为空,则第二个列表将保持不变。换句话说,返回的函数与身份函数(专用于应用于列表)完全没有区别。
第二种情况返回值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