匹配元组列表中的一个项目

时间:2010-12-17 17:28:32

标签: list ocaml

我有一个(string, int)形式的元组列表。我正在尝试搜索列表并返回其字符串组件与参数匹配的元组,如:let find_tuple string_name tuples_list =

我该怎么做?我无法完全绕过它。有没有办法使用匹配的语法,如(string, _) ->...

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

是的,你确实使用了匹配的语法,但是需要匹配警卫(或者你可以使用if then else)。 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 -> ...

编辑:一个更好的谓词:

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)。如果你想要元组的值,要么重新创建它,要么使用第一种方法。