2010-12-17 16 views
8

Ho una lista di tuple della forma (string, int). Sto cercando di cercare nell'elenco e restituire la tupla il cui componente stringa corrisponde al parametro, come in: let find_tuple string_name tuples_list =Partita un elemento nella lista di tuple

Come posso fare questo? Non riesco quasi a capirlo. C'è un modo per utilizzare la sintassi di corrispondenza come (string, _) ->...?

risposta

7

È possibile ottenere questo come segue

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 

o semplicemente

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

È possibile utilizzare la parola chiave 'as' per semplificare un po 'le cose:' | ((s, i) as h) :: tl -> if ... then h else ... 'Inoltre, non conoscevo la funzione' fst', grazie per averlo indicato! –

+1

La seconda opzione può anche essere scritta come 'List.find (fun (string, _) -> string = string_name) tuples_list', che ha il' (stringa, _) 'l'OP desiderato. – sepp2k

+0

Grazie! Con un 'let rec' ha funzionato perfettamente. – yavoh

1

Sì, non utilizzare la corrispondenza della sintassi del genere, ma avrete bisogno di guardie partita (oppure è possibile utilizzare se poi il resto) . Il modulo ha una funzione chiamata find che restituirà il primo elemento che corrisponde a un predicato. Ha anche la funzione filter (e find_all - stessa funzione) che restituisce un elenco di tutti gli elementi che corrispondono al predicato. Ad esempio:

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: un predicato meglio:

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

Tuttavia la soluzione migliore è quella di utilizzare List.assoc che lavora su liste di tuple, e considera le tuple come coppie chiave-valore:

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

Anche se il valore di ritorno della List.assoc è il secondo elemento della tupla (una int nel tuo caso). Se si desidera il valore della tupla, ricrearlo o utilizzare il primo approccio.

Problemi correlati