13

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

let inline implicit arg =
  ( ^a : (static member op_Implicit : ^b -> ^a) arg)

要求参数上的给定运算符或成员。有没有办法根据类似的东西进行匹配?

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

4

2 回答 2

30

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

let inline (|Test|_|) (a:^T) : option< ^R > =
  (^T : (member Test : unit -> option< ^R >) a)

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

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

match new A() with
| Test(n) -> printfn "%d" n
| _ -> printfn "failed"

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

于 2011-09-03T11:53:23.373 回答
0

我认为你必须使用反射,例如有一个函数,o:obj然后反射 overo.GetType()的成员。

于 2011-09-03T11:52:32.987 回答