了解Ocaml中的Fold_Left

时间:2013-09-09 15:00:58

标签: list functional-programming ocaml fold

我一直试图获取Ocaml列表中的最后一项。 这就是我的尝试。

let last2 (xs:'a list) : 'a =
    List.fold_left (fun acc element -> let acc=element) acc xs;; 

但它没有用。我的想法是acc将是元素,直到列表中的最后一项。并且在到达列表末尾后返回acc将给出列表中的最后一项。

有人可以帮忙吗?提前谢谢。

编辑:我接近以下

let last2 (xs:'a list) : 'a =
    List.fold_left (fun a b -> b) 1 xs;;

但是,我只能在整数列表中使用last2。多态的last2会更好。

1 个答案:

答案 0 :(得分:1)

您的想法是正确的,但您表达它的语法是错误的。这个功能:

# fun acc element -> let acc = element;;
Error: Syntax error

不正确(你可能已经注意到了)。

定义一个返回值expr的函数:

fun a b -> <expr>

您的表达式应具有值b。所以你的功能看起来像这样:

fun a b -> b

(可能的重新命名。)

另一种查看问题的方法是,当您使用let作为表达式时,它需要in。所以你可以像这样编写函数(尽管它是多余的):

fun a b -> let a = b in a

然而,这种形式似乎是必须思考的结果。您没有为a分配新值。你刚刚返回一个值。

以下功能完全相同;它只是将第二个a重命名为其他内容:

fun a b -> let zzz = b in zzz

一般来说,在OCaml中你想放弃为变量赋值的想法。它们是不可改变的,不能改变价值(一般来说)。

<强>更新

这是一个会话,显示fun a b -> b将解决问题。

$ ocaml
        OCaml version 4.00.1

# List.fold_left (fun a b -> b) 0 [2; 3; 4; 88];;
- : int = 88

容易忘记的一件事是你需要为累加器提供一个起始值。一个明显的选择是列表的第一个元素。 (必须有第一个元素;空列表没有最后一个元素。)