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

时间:2016-10-05 03:08:11

标签: list ocaml reverse

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

也许我在上一个s := hd :: !s部分遇到了麻烦。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

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的最大好处之一,即使你不继续一名功能性程序员。)