2011-01-14 22 views
4

皆さん、私はOCamlとパターンマッチングにはかなり新しいので、これを理解しようとするのは苦労していました。Ocamlパターンマッチング

タプルのリストがあるとします。私がしたいのは、タプルの最初の要素に基づいてタプルの1つにパラメータをマッチさせることです。タプルの2番目の要素を返したいとします。したがって、たとえば、私はこのような何かをしたい:私はmap_left_to_right「B」リストを使用している場合

let list = [ "a", 1; "b", 2; "c", 3; "d", 4 ] ;; 
let map_left_to_right e rules = match e with 
    | first -> second 
    | first -> second 
    | first -> second 

、私はお返しに2を取得したいです。 したがって、ルールのリスト内のすべての最初の要素をリストし、これらの要素の1つとパラメータを一致させたいと思いますが、その方法はわかりません。私は、List.iterまたはList.for_allのどちらかを使用して、このようなことをする必要があると考えていました。どんな助けもありがとう。ありがとう!

答えて

6

パターンマッチングは、パターンの固定リストを一致させる場合に使用します。あなたの現在の状況では、使用するための慣用的な事はList.assocです:

let map_left_to_right e rules default = 
    try List.assoc e rules with Not_found -> default 

あなたは要素が見つからない場合、デフォルトを提供する必要があります。ここではmap_left_to_right "b" list 0は2を期待通りに返し、map_left_to_right "z" list 0は0を返します。

1

変数は固定パターンとの一致のみを一致させます。この場合には、一致の適切な使用は、次のようになります(ただ他の回答のように、「デフォルト」を含めることに注意してください)

let list = [ "a", 1; "b", 2; "c", 3; "d", 4 ] 
let rec map_left_to_right e rules default = match rules with 
    [] -> default (* No rules left to match *) 
    | (first,second)::rest -> (* At least one rule remaining, which we'll put into first,second *) 
     if first = e 
     then second 
     else map_left_to_right e rest default 

我々は何も見つからなかった場合は0を返すようにしたい場合、これは希望そのように呼ばれること:

map_left_to_right "b" list 0 

このすべては、他の回答のコードと機能的に同等であり、実際に、私はそれは小さいですし、既存のライブラリをより有効に利用しますので、そのコードを使用することをお勧めしますが、私はと思いましたこの場合、パターンマッチングが実際にどのように適用されるかをよりよく示すため、このコードを与えます。

関連する問題