F# 活动模式作为非静态成员
我不确定是否允许非静态公共成员活动模式,但您可以定义它们而不会引起编译器的抱怨。如果允许的话,匹配的语法是什么?编译器给我 FooBar2.doSomething 中的 Foo 类型不匹配。期待 'a ->给定
'a -> 选择<'b,'c>
'd->选择<单位,单位>
// No error in this class, static works great
type FooBar() =
static member (|Foo|Bar|) (x, y) =
match x = y with
| true -> Foo
| false -> Bar
member x.doSomething y =
match x, y with
| Foo -> ()
| Bar -> ()
type FooBar2() =
member x.(|Foo|Bar|) y =
match x = y with
| true -> Foo
| false -> Bar
// compiler error on "Foo"
member x.doSomething y =
match y with
| Foo -> ()
| Bar -> ()
I'm not sure if non-static public member active patterns are allowed but you can define them without the compiler complaining. If they are allowed what's the syntax for matching against one? The compiler is giving me a type mismatch for Foo in FooBar2.doSomething. Expecting a 'a -> Choice<'b,'c>
given 'a -> 'd -> Choice<unit,unit>
// No error in this class, static works great
type FooBar() =
static member (|Foo|Bar|) (x, y) =
match x = y with
| true -> Foo
| false -> Bar
member x.doSomething y =
match x, y with
| Foo -> ()
| Bar -> ()
type FooBar2() =
member x.(|Foo|Bar|) y =
match x = y with
| true -> Foo
| false -> Bar
// compiler error on "Foo"
member x.doSomething y =
match y with
| Foo -> ()
| Bar -> ()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
活动模式不应用作成员。事实上,这些编译器完全是一个编译器错误,我们将修复该错误(感谢您的报告:))。使用本地或模块绑定的“let”来定义活动模式。
Active patterns should not be used as members. The fact that these compile at all is a compiler bug that we'll fix (thanks for the report :) ). Use local or module-bound "let"s to define an active pattern.
我对此不起作用并不感到惊讶,而且我看不到例如活动模式的自然语义解释。当您看到
Foo
模式时,如何知道要使用哪个实例?您是否可以为Foo
和Bar
案例提供不同的实例(因此模式匹配不完整)?这里的问题似乎没有一个优雅的解决方案。老实说,我很惊讶即使是静态情况也能工作,而且我在规范中没有看到任何内容将活动模式的定义作为任何类型的成员。I'm not surprised that this doesn't work, and I can't see a natural semantic interpretation for instance active patterns. How do you know which instance to use when you see the
Foo
pattern? Could you have different instances for theFoo
andBar
cases (and therefore an incomplete pattern match)? There doesn't seem to be an elegant resolution to the issues here. To be honest, I'm suprised that even the static case works, and I don't see anything in the spec addressing the definition of active patterns as members of any kind.成员识别器似乎从 1.9.9.9 版本开始就不再存在了。即使对于静态成员也是如此。我认为这是一种耻辱,因为它允许识别器过载。我可以有一个用于类型、MemberInfo 等的“名称”识别器。现在我需要有一个“Type_Name”。 'Member_Name' 等以避免命名冲突。只是“名字”更好。
Member recognizers seem to be out since version 1.9.9.9. even for static members. I think it is a shame because it allowed for recognizer overloading. I could have a 'Name' recognizer for Type, MemberInfo etc. Now I need to have a 'Type_Name'. 'Member_Name' etc. to avoid naming conflicts. Just 'Name' was nicer.