2011-01-14 128 views
4

嗨,我很新,OCaml和模式匹配,所以我很難找出這個問題。Ocaml模式匹配

說我有一個元組列表。我想要做的是根據元組中的第一個元素將一個參數與一個元組進行匹配,並且這樣做後,我想返回元組的第二個元素。因此,例如,我想要做這樣的事情:

let list = [ "a", 1; "b", 2; "c", 3; "d", 4 ] ;; 
let map_left_to_right e rules = match e with 
    | first -> second 
    | first -> second 
    | first -> second 

如果我使用map_left_to_right「b」的名單,我想2的回報。 因此,我想列出規則列表中的所有第一個元素,並將這些參數與其中一個元素進行匹配,但我不知道如何執行此操作。我在想,我需要使用List.iter或List.for_all來做這樣的事情。任何幫助,將不勝感激。謝謝!

回答

6

模式匹配適用於您希望匹配固定模式列表的情況。在你目前的情況,使用慣用的是List.assoc

let map_left_to_right e rules default = 
    try List.assoc e rules with Not_found -> default 

您需要提供一個默認的時候沒有找到的元素。這裏,map_left_to_right "b" list 0將按預期返回2,並且map_left_to_right "z" list 0將返回0.

1

僅匹配固定模式而不是變量。在這種情況下,適當使用匹配的是這樣的:(注意一個「默認」列入就像在其他的答案)

let list = [ "a", 1; "b", 2; "c", 3; "d", 4 ] 
let rec map_left_to_right e rules default = match rules with 
    [] -> default (* No rules left to match *) 
    | (first,second)::rest -> (* At least one rule remaining, which we'll put into first,second *) 
     if first = e 
     then second 
     else map_left_to_right e rest default 

如果我們想如果沒有找到,返回0,那麼這將被稱爲像這樣:

map_left_to_right "b" list 0 

所有這一切都在功能上等同於其他答案的代碼,並在實踐中我會推薦使用的代碼,因爲它的體積更小,更好地利用現有的庫,但我認爲,我會給出這段代碼,因爲它更好地說明了在這種情況下實際應用模式匹配的方式。