9

マップを考えると:

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

1 に答える 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")]
于 2012-09-18T20:18:52.203 に答える