我一直试图获取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会更好。
答案 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
容易忘记的一件事是你需要为累加器提供一个起始值。一个明显的选择是列表的第一个元素。 (必须有第一个元素;空列表没有最后一个元素。)