我们有这个小帮手功能
open System
let (|NonEmptyString|) value =
if String.IsNullOrEmpty value
then failwith "String must be non-empty."
else value
let (|StartsWithX|) (value:string) =
if value.StartsWith("X") |> not
then failwith "String must start with X."
else value
在函数接口中使用活动模式匹配函数NonEmptyString可以正常工作:
let hi (NonEmptyString s) = printfn "Hi %s" s
hi "X" // Hi X
hi "" // System.Exception: String must be non-empty.
现在问题。
将一些验证器组合在一起作为更复杂的验证约束会很好,就像这样
let hi (NonEmptyString s & StartsWithX s) = printfn "Hi %s" s
// error FS0038: 's' is bound twice in this pattern
如果只允许一个's',我们可以考虑组合这些函数,这样我们只有一个参数s。 并且因为活动模式匹配功能当然是功能,所以应用功能组合运算符>>但它不适合这里。
let hi (NonEmptyString >> StartsWithX s) = printfn "Hi %s" s
// error FS0010: Unexpected infix operator in pattern
问题是,我们如何做到这一点(在F#4.0中)?
答案 0 :(得分:0)
正如@kvb评论的那样,通配符_有助于AND案例
// OR
let hi (NonEmptyString s | StartsWithX s) = printfn "Hi %s" s
// The logic here makes less sense. It's kept simple with the given helper functions from above.
OR案例适用于两个'绑定
{{1}}
注意:
这只是用于在功能界面上以描述性方式尝试使用活动模式匹配的组合作为代码契约。
这可以看作是使用或滥用主动模式匹配(惯用F#或不是),这是您的选择!