【发布时间】:2017-10-09 09:40:36
【问题描述】:
我有以下代码(`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)。恕我直言,如果我可以在同一情况下进行所有检查,它看起来会稍微干净一些,即使用例如 Field1 = IgnoreCase "invalid" 与其他匹配一起匹配Field1 <> IgnoreCase "invalid",但该特定示例无法编译。我知道守卫,但这似乎并不比原来的解决方案干净。
是否可以在不使用守卫的情况下进行“负”(逻辑非)模式匹配,即一个值不应该与其他值匹配?
【问题讨论】:
-
你可以添加一个守卫:
{Field1 = f} when f <> "invalid". -
谢谢。我知道警卫,并打算在问题中提及这一点。现已更新。
标签: f# pattern-matching