ネガパターン:あなたが見ることができるように私は、次のコードは、( `IGNORECASEは、私が他の場所で定義されているアクティブなパターンです)持って試合
match myType with
| {Field1 = IgnoreCase "invalid"} -> None
| {Field2 = Some f2
Field3 = Some f3
Field4 = None | Some (0 | 1 | 2)}
-> Some (f2, f3)
| _ -> None
、Field1
はブラックリストに値を持っているとField4
が値をホワイトリストに登録しました(そうField2
を行いますそしてField3
という意味ではSome
でなければなりません)。 IMHO同じケースですべてのチェックを行うことができれば、つまり、Field1 = IgnoreCase "invalid"
の一致を他の一致と一緒に行うことができます。 Field1 <> IgnoreCase "invalid"
ですが、その特定の例はコンパイルされません。私はガードについて知っていますが、それは元の解決策よりもきれいには見えません。
ガードを使用せずに値が他の値と一致しないという意味で「否定」(論理NOT)パターンのマッチングは可能ですか?そして、あなたはパターンマッチの内側にそれを使用することができます
let (|Not|_|) a b = if a <> b then Some() else None
:
f <> "無効"のときにガード:{{Field1 = f}を追加できます。 – Lee
ありがとうございます。私は警備員について知っていて、その質問に言及することを意図していました。今更新されました。 – cmeeren