-5

私はOCamlを学んでおり、私が自分自身に与えた練習上の問題の1つは、作成されたリスト内の要素のインデックスを見つけることです。これまでのところ、私はそれを持っていると思っていましたが、私はこのコードブロックを何年もの間書き直していて、戻り値が正しくない理由を理解できないようです。

let rec indexer_helper list element index pos found= 
match l with 
        []      ->  if (found = false) then
                        (-1)
                    else
                        index

    |   (h::t)  ->  if (h = e) then
                        index = pos
                        pos = pos + 1
                        indexer_helper t element index pos true
                    else
                        pos = pos + 1
                        indexer_helper t element index pos found;;

let rec indexer list element = indexer_helper list element 0 0 false;;

編集:問題は解決しました。問題は、不変変数を「変更」するときにletステートメントを使用するのを忘れていたことです。

4

1 に答える 1

3

ここでは、命令反射神経を少し使いすぎています。これらのOCamlライン:

index = pos
pos = pos + 1

ブール値を計算しており、変数に値を割り当てていません。OCamlでは変数(そのようなもの)に値を割り当てることはできません。変数は不変です。OCamlでこれらの行を書く慣用的な方法は次のようなものです。

let index' = pos in
let pos' = pos + 1 in
index_helper t element index' pos' true

ここには他にもエラーがありますが、これは最初に理解することとして私を襲います。

于 2013-03-23T18:15:59.420 に答える