2010-12-17 22 views
8

(string, int) formunun bir dizi listesi var. Listede arama yapmaya ve dize bileşeni parametreyle eşleşen tuple döndürmeye çalışıyorum: let find_tuple string_name tuples_list = Bunu nasıl yapabilirim? Kafamı etrafına dolamıyorum. (string, _) ->... gibi eşleşen sözdizimini kullanmanın bir yolu var mı?Bir öğenin tuples listesiyle eşleşmesi

cevap

7

Sen

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 

veya basitçe

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

Bazı şeyleri basitleştirmek için '' '' anahtar sözcüğünü kullanabilirsiniz: '| ((s, i) olarak h) :: tl -> eğer ... o zaman h ... 'Ayrıca,' fst' işlevi hakkında bilmiyordum, bunu işaret ettiğin için teşekkürler! –

+1

İkinci seçenek, OP'nin aranan '(string, _) 'i içeren' List.find (fun (string, _) -> string = string_name) tuples_list' olarak da yazılabilir. – sepp2k

+0

Teşekkürler! Bir 'rec rec' ile mükemmel çalıştı. – yavoh

1

Evet, böyle sözdizimi eşleşen kullanırım şöyle bunu başarabilirsiniz, ancak maç korumaları gerekir (veya başka ardından eğer kullanabilirsiniz) . List modülünde, bir yüklemeyle eşleşen ilk öğeyi döndürecek find adlı bir işlev bulunur. Ayrıca, yüklemeyle eşleşen tüm öğelerin listesini döndüren filter (ve find_all - aynı işlev) işlevine de sahiptir.

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 -> ... 

DÜZENLEME: daha iyi bir yüklem: Örneğin

: daha iyi bir çözüm dizilerini listelerde çalışır List.assoc kullanmak, ve anahtar değeri çifti olmak üzere dizilerini dikkate Ancak

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

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

List.assoc dönüş değeri başlığın ikinci öğesi (sizin durumunuzda bir int) olmasına rağmen. Eğer tupenin değerini istiyorsanız, ya yeniden oluşturun ya da ilk yaklaşımı kullanın.

İlgili konular