活动模式和成员约束

发布于 2024-12-02 22:25:26 字数 253 浏览 2 评论 0原文

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

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

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

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

For an inline function one could create a constraint like:

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

requiring the given operator or member on the arguments. Is there a way to match based on somthing similar?

I want to create an active pattern where any argument that's passed to the method that matches the constraint of an inlined function as the above triggers that function and everything else ends as part of some error management.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

淡忘如思 2024-12-09 22:25:26

看起来您也可以编写内联活动模式。我以前没用过这个,但我现在尝试了一下,似乎效果很好。下面的 Test 模式可与任何实现返回 optionTest 方法的对象一起使用。 ^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"

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

It looks like you can write inline active patterns too. I haven't used this before, but I tried it now and it seems to work just fine. The Test pattern below can be used with any object that implements Test method that returns option< ^R >:

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

Now you can define some objects that define Test method and match them using the pattern:

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

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

This looks like a very interesting technique, because pattern matching is now a part of the object.

此生挚爱伱 2024-12-09 22:25:26

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

I think you'd have to use reflection, e.g. Have a function that takes o:obj and then reflect over o.GetType()'s members.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文