2010-12-17 10 views
8

タプルの一覧は(string, int)です。私は、リストを検索して、その文字列コンポーネントがパラメータと一致するタプルを返そうとしています:let find_tuple string_name tuples_list =タプル一覧の1つの項目に一致する

どのようにすればいいですか?私はそれの周りに私の頭をかなり包むことができません。 (string, _) ->...のような一致する構文を使用する方法はありますか?

答えて

7

あなたは

let rec find_tuple string_name tuples_list = 
     match tuples_list with 
      [] -> raise Not_found 
      |(s, i)::tl -> if s = string_name then (s, i) 
            else find_tuple string_name tl 

または単に

List.find (fun s -> fst s = string_name) tuples_list 
+0

'as'キーワードを使用すると、少し単純化することができます。 ((s、i)h):: tl - > if ... then h else ... 'また、fst関数について知りませんでした。 –

+1

2番目のオプションは、 'List.find(fun(string、_) - > string = string_name)tuples_list'と書くこともできます。 – sepp2k

+0

ありがとう! 'let rec'を使って完全に動作しました。 – yavoh

1

はい、あなたはそのようにマッチング構文を使うのですが、試合の警備員が必要になります(または、その後、他の場合に使用することができます)を以下のようにこれを達成することができます。 Listモジュールには、述語と一致する最初の要素を返す、findという関数があります。また、述語と一致するすべての要素のリストを返す関数filter(およびfind_all - 同じ関数)もあります。たとえば:

let predicate string_name tuple = match tuple with (s, _) when s = string_name -> true 
    | _ false 

try 
    let x = List.find (predicate "query") tuples_list in 
    ... 
    with Not_found -> ... 

EDIT:より良い述語:

let predicate string_name (s, _) = s = string_name 

は、しかし、より良い解決策は、タプルのリストに働くList.assocを使用することで、タプルはキーと値のペアとみなし:

try 
    let x = List.assoc "query" tuples_list in ... 
with Not_found -> ... 

List.assocの戻り値は、タプル(あなたのケースでint)の2番目の要素であるが。タプルの値が必要な場合は、再作成するか、最初の方法を使用します。

関連する問題