在F#中使用映射进行模式匹配

9

给出这个地图:

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

有没有一种方式可以使用类似于列表 cons 运算符的模式匹配呢?

就像这样:

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

或者:

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

我不想做的事情是这样的:

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

我该如何使用map进行模式匹配?

4
编写一个ActivePattern,调用TryFind函数。 - Brian
1个回答

16

正如您所指出的,使用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")]

5
保罗,我认为你的猫踩到了键盘。 - Daniel
我的猫远远没有那么精确。 - sblom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接