let rec reverse l =
let s = ref [] in
match l with
| [] -> !s
| hd::tl -> s := hd :: !s
reverse tl
也许我在上一个s := hd :: !s
部分遇到了麻烦。
我该如何解决这个问题?
答案 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的最大好处之一,即使你不继续一名功能性程序员。)