【发布时间】:2016-10-07 15:57:23
【问题描述】:
let rec reverse l =
let s = ref [] in
match l with
| [] -> !s
| hd::tl -> s := hd :: !s
reverse tl
也许我在最后一个s := hd :: !s 部分遇到了麻烦。
我该如何解决这个问题??
【问题讨论】:
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 的最大好处之一,即使你没有继续学习一个函数式程序员。)
【讨论】: