2010-12-17 1 views
8

У меня есть список кортежей (string, int). Я пытаюсь выполнить поиск по списку и вернуть кортеж, чей строковый компонент соответствует параметру, как в: let find_tuple string_name tuples_list =Совпадение одного элемента в списке кортежей

Как это сделать? Я не могу ее обернуть. Есть ли способ использовать соответствующий синтаксис, например (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

Второй вариант также можно записать как «List.find (fun (string, _) -> string = string_name) tuples_list', в котором есть' (string, _) 'OP. – sepp2k

+0

Спасибо! С 'let rec' он работал отлично. – yavoh

1

Да, вы использовать соответствующий синтаксис, как это, но нужно будет матч охранников (или вы можете использовать, если потом еще) , Модуль List имеет функцию, называемую find, которая вернет первый элемент, соответствующий предикату. Он также имеет функцию filterfind_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 в вашем случае). Если вы хотите получить значение кортежа, воссоздайте его или используйте первый подход.