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.
fonte
2010-12-17 17:40:45
È 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! –
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
Grazie! Con un 'let rec' ha funzionato perfettamente. – yavoh