我有一个(string, int)
形式的元组列表。我正在尝试搜索列表并返回其字符串组件与参数匹配的元组,如:let find_tuple string_name tuples_list =
我该怎么做?我无法完全绕过它。有没有办法使用匹配的语法,如(string, _) ->...
?
答案 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
)。如果你想要元组的值,要么重新创建它,要么使用第一种方法。