1

我一直在尝试获取 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 会更好。

4

1 回答 1

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

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

于 2013-09-09T15:12:36.800 回答