2012-09-18 16 views
6

Data la mappa:pattern matching con le mappe in F #

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

C'è un modo posso usare il pattern matching simile ad un operatore di lista contro?

Qualcosa di simile a questo:

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

Oppure:

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

Quello che non voglio fare è questo:

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

Come posso fare pattern matching con un carta geografica?

+4

Autore un ActivePattern che chiama TryFind. – Brian

risposta

13

Come si è notato, la corrispondenza su TryFind rappresenta l'approccio standard e non riesco a pensare a un motivo valido per avvolgerlo con un modello attivo per un semplice controllo dei tasti. Tuttavia, se si sta andando per qualcosa di simile elenco destrutturazione (cioè restituire il valore trovato e il resto della mappa) questo dovrebbe funzionare:

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

Paul, penso che il tuo gatto abbia colpito la tastiera. – Daniel

+0

Il mio gatto non è in nessun posto così preciso. – sblom