2012-09-18 17 views
6

Dado el mapa:coincidencia de patrones con los mapas en Fa #

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

¿Hay una manera que puede utilizar coincidencia de patrón similar a un operador de la lista de contras?

Algo como esto:

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

O:

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

Lo que no quiero hacer es lo siguiente:

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

¿Cómo puedo hacer comparación de patrones con una ¿mapa?

+4

Autor de una ActivePattern que llama TryFind. – Brian

Respuesta

13

Como ha señalado, coincide más de TryFind es el enfoque estándar y no puedo pensar en una razón convincente para envolverlo con un patrón activo para una simple comprobación de clave. Sin embargo, si usted va para algo así como la lista de desestructuración (es decir, devolver el valor que se encuentra y el resto del mapa) esto debería funcionar:

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, creo que tu gato tocó el teclado. – Daniel

+0

Mi gato no está en ninguna parte _cerca_ tan preciso. – sblom

Cuestiones relacionadas