2016-10-05 19 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で逆転リスト機能を書くことに問題があります

どうすればこの問題を修正できますか?あなたがそれらを順番に評価し、より大きな式にこれらの式に参加する必要があり

s := hd :: !s 
reverse tl 

+2

これは、重複したまたは[これ](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

一つの問題は、あなたが2つの式を持っているということです。これを行う方法は;(セミコロン)演算子である:

s := hd :: !s ; 
reverse tl 

あなたの他の問題は、各再帰呼び出しで異なるsを持っているということです。すべての通話に同じsを使用する必要があります。

let outer_fun l = 
    let s = ref [] in 
    let rec inner_fun = ... in 
    inner_fun l 

は(サイドコメントとして、それは価値があるかもしれません:

これを行うための基本的なレイアウトはs、これは1 s使用して作業を行い、内部再帰関数を定義外の機能を持つことです純粋な関数を書くことを学ぶことは、たとえ関数型プログラマーでなくても、OCamlを学ぶことの最大の利点の1つです。

関連する問題