2016-10-09 10 views
3

こんにちは私はOCamlを初めて使いました。そして、私は末尾再帰の基本的な構文を学ぼうとしています。私はリストを取得し、要素とそのインデックスを含む二重引用符でリストを返すために次のコードを書いた。例えば、 ["b"; "c"; "dd";]→[( "b"、0); ( "c"、1); (「DD」、2)] Ocamlタイプエラー列挙例の場合

は、私は次のコードを書いた:

let enumerateWithTail lst = 
    let rec inside lst acc index = 
    match lst with 
    | [] -> acc 
    | x::xs -> inside xs (x,index)::acc (index+1) 
in inside lst [] 0;; 

これは動作しませんが、(少なくとも私はそのかなり類似したと思う)私の教授の例が動作します。私の教授のコードは次のとおりです。で

感謝を この式は B「*」と入力しているが、発現がcリスト」タイプに期待されました:私のコードはエラーになりますなぜ

let enumerate lst = 
    let rec aux lst acc = 
    match lst with 
    | [] -> acc 
    | x::xs -> let (eList, index) = acc 
       in aux xs ((x, index)::eList, index+1) 
    in List.rev(fst(aux lst ([], 0))) 

誰かが説明していただけます前進!

答えて

6

問題は優先されます。関数のアプリケーションは、::を含む任意の演算子よりも高い優先順位を、持っているので、この:何がしたいことはあるのに対し

(inside xs (x,index)) :: (acc (index+1)) 

inside xs ((x,index)::acc) (index+1) 
+2

この優先順位の問題が来た

inside xs (x,index)::acc (index+1) 

は次のように解釈されます最近ではここで繰り返し繰り返しています。 OCamlの教師は注意する必要があります。それは早い段階で説明するものかもしれません。 –

関連する問題