如果可以将普通函数用作模式,则不必编写琐碎的活动模式,例如
let (|NotEmpty|_|) s = Seq.tryPick Some s
并且假设允许
let s = seq []
match s with
| Seq.tryPick Some -> ...
| _ -> //empty
这将使函数更具可重用性,消除对要与匹配一起使用的“模式化”函数的需要:
let f x = if x then Some() else None
let (|F|_|) = f
我知道活动模式可能被称为函数,因此可以通过仅定义模式来简化前面的示例。但是放弃特殊的模式语法可以简化这一点。
特殊语法的原因是什么?
编辑
在下文中,活动模式会遮蔽文字。
[<Literal>]
let X = 1
let (|X|_|) x = if x = 0 then Some() else None
match 0 with //returns true
| X -> true
| _ -> false
为什么这也不适用于模式中的函数调用?
编辑 2
我发现了一个模棱两可的场景
let zero n = if n = 0 then Some() else None
match 0 with
| zero -> //function call or capture?
在我看来,这阐明了为什么活动模式必须以大写字母开头——它使意图更清晰,并且使阴影(例如在我之前的示例中)的可能性大大降低。