-3
let rec reverse l =
let s = ref [] in
match l with
| [] -> !s
| hd::tl -> s := hd :: !s
reverse tl
也许我在最后的s := hd :: !s
部分遇到了麻烦。我在写OCaml中的反转列表功能时遇到了麻烦
我该如何解决这个问题?
let rec reverse l =
let s = ref [] in
match l with
| [] -> !s
| hd::tl -> s := hd :: !s
reverse tl
也许我在最后的s := hd :: !s
部分遇到了麻烦。我在写OCaml中的反转列表功能时遇到了麻烦
我该如何解决这个问题?
的一个问题是,你有两个表达式:
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的最大好处之一,即使你不成为函数式编程人员也是如此)。
这是一个重复的或非常类似[this](http://stackoverflow.com/questions/21286668/list-reversing-in-ocaml),[this](http ://stackoverflow.com/questions/22221053/ocaml-reverse-a-list)和[this](http://stackoverflow.com/questions/7382140/reversing-a-list-in-ocaml-using-fold-左 - 右)StackOverflow的问题。此外,如果您使用“在ocaml中反转列表”,则会在您遇到的无数其他资源中解决此问题。看起来你需要的是OCaml的基本编程帮助,而且这个问题对未来的问题解决者没有什么价值。 –