与F#中的地图匹配的模式

Pau*_*icz 7 f#

鉴于地图:

let myMap = Map.ofArray [| (1,"A");(2,"B") |]
Run Code Online (Sandbox Code Playgroud)

有没有办法可以使用类似于列表合并运算符的模式匹配?

像这样的东西:

match myMap with      //doesn't work
    (1, value) -> ()
  | _          -> ()
Run Code Online (Sandbox Code Playgroud)

要么:

match myMap with      //doesn't work 
    1::value -> ()
  | _        -> ()
Run Code Online (Sandbox Code Playgroud)

我不想做的是这样的:

match myMap.TryFind(1) with      //boring
    Some value -> ()
  | _          -> ()
Run Code Online (Sandbox Code Playgroud)

如何与地图进行模式匹配?

Dan*_*iel 15

正如您所指出的那样,匹配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")]
Run Code Online (Sandbox Code Playgroud)

  • 保罗,我想你的猫撞到了键盘. (5认同)