活动模式和成员约束

Run*_* FS 13 f# inline constraints active-pattern

对于内联函数,可以创建一个约束,如:

let inline implicit arg =
  ( ^a : (static member op_Implicit : ^b -> ^a) arg)
Run Code Online (Sandbox Code Playgroud)

在参数上要求给定的运算符或成员.是否有基于相似的东西匹配的方法?

我想创建一个活动模式,其中传递给方法的任何参数与内联函数的约束匹配,如上所述触发该函数,其他所有内容都作为一些错误管理的一部分结束.

Tom*_*cek 30

看起来您也可以编写内联活动模式.我以前没用过这个,但我现在试了一下,看起来工作得很好.Test下面的模式可以与任何实现Test返回的方法的对象一起使用option< ^R >:

let inline (|Test|_|) (a:^T) : option< ^R > =
  (^T : (member Test : unit -> option< ^R >) a)
Run Code Online (Sandbox Code Playgroud)

现在,您可以定义一些定义Test方法的对象,并使用模式匹配它们:

type A() =
  member x.Test() = Some(10)

match new A() with
| Test(n) -> printfn "%d" n
| _ -> printfn "failed"
Run Code Online (Sandbox Code Playgroud)

这看起来是一种非常有趣的技术,因为模式匹配现在是对象的一部分.