我在 OCaml 中编写反转列表函数时遇到了麻烦

I'm in trouble with writing reversing list function in OCaml

let rec reverse l =
  let s = ref [] in
    match l with
    | [] -> !s
    | hd::tl -> s := hd :: !s
                reverse tl

也许我在最后 s := hd :: !s 部分遇到了麻烦。

我该如何解决这个问题?

一个问题是你有两个表达式:

s := hd :: !s
reverse tl

您需要将这些表达式连接成一个更大的表达式,以便按顺序计算它们。方法是使用 ;(分号)运算符:

s := hd :: !s ;
reverse tl

你的另一个问题是你在每次递归调用中都有不同的s。您需要对所有调用使用相同的 s

这样做的基本布局是有一个定义 s 的外部函数和一个使用这个 s:

完成工作的内部递归函数
let outer_fun l =
    let s = ref [] in
    let rec inner_fun = ... in
    inner_fun l

(作为附带评论,可能值得找出一种不使用引用的方法来执行此操作。学习编写纯函数是学习 OCaml 的最大好处之一,即使您不继续成为一名函数式程序员。)