2016-10-05 61 views
-3
let rec reverse l = 
    let s = ref [] in 
    match l with 
    | [] -> !s 
    | hd::tl -> s := hd :: !s 
       reverse tl 

也许我在最后的s := hd :: !s部分遇到了麻烦。我在写OCaml中的反转列表功能时遇到了麻烦

我该如何解决这个问题?

+2

这是一个重复的或非常类似[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的基本编程帮助,而且这个问题对未来的问题解决者没有什么价值。 –

回答

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的最大好处之一,即使你不成为函数式编程人员也是如此)。