2012-09-18 20 views
6

鑑於地圖與地圖匹配:模式在F#

let myMap = Map.ofArray [| (1,"A");(2,"B") |] 

有沒有一種方法,我可以使用模式匹配類同列表利弊操作?

事情是這樣的:

match myMap with  //doesn't work 
    (1, value) ->() 
    | _   ->() 

或者:

match myMap with  //doesn't work 
    1::value ->() 
    | _  ->() 

什麼,我不希望做的是:

match myMap.TryFind(1) with  //boring 
    Some value ->() 
    | _   ->() 

我該怎麼做模式與匹配地圖?

+4

作者調用TryFind的ActivePattern。 – Brian

回答

13

正如您所指出的那樣,匹配TryFind是標準方法,我想不出一個令人信服的理由用簡單密鑰檢查的活動模式來包裝它。然而,如果你想要進行列表解構(即返回找到的值和地圖的其餘部分),這應該工作:

let (|Found|_|) key map = 
    map 
    |> Map.tryFind key 
    |> Option.map (fun x -> x, Map.remove key map) 

let map = Map.ofList [1, "A"; 2, "B"] 
match map with 
| Found 1 (x, rest) -> printfn "Value: %A, Remaining: %A" x rest 
| _ ->() 

//prints: Value: "A", Remaining: map [(2, "B")] 
+0

Oooooooooooooooo –

+5

保羅,我覺得你的貓撞上了鍵盤。 – Daniel

+0

我的貓在哪裏都不是那麼確切。 – sblom