2010-12-17 80 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)as h):: tl - > if ... then h else ...'另外,不知道'fst'函數,謝謝指出! – 2010-12-17 17:49:49

+1

第二個選項也可以寫成'List.find(fun(string,_) - > string = string_name)tuples_list',它具有OP想要的'(string,_)'。 – sepp2k 2010-12-17 17:53:29

+0

謝謝!有一個'讓rec'它完美的工作。 – yavoh 2010-12-17 18:00:00

1

是的,你確實使用匹配語法類似,但需要匹配後衛(或者你可以,如果再使用別的) 。 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)第二元件。如果你想要元組的值,可以重新創建它,或者使用第一種方法。

相關問題