如何在函数表达式中组合F#活动模式匹配函数?

时间:2016-01-05 20:36:54

标签: f# active-pattern

我们有这个小帮手功能

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中)?

1 个答案:

答案 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#或不是),这是您的选择!