我不确定是否允许非静态的公共成员活动模式,但是你可以定义它们而不会引起编译器的抱怨。如果它们是被允许的,那么匹配它们的语法是什么?编译器给了我一个与FooBar2.doSomething中的Foo不匹配的类型。需要给定'a -> 'd -> Choice<unit,unit>
的'a -> Choice<'b,'c>
// 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 -> ()
发布于 2009-12-03 01:05:16
不应将活动模式用作成员。事实上,这些编译实际上是一个编译器错误,我们将修复(感谢报告:)。使用本地或模块绑定的“let”来定义活动模式。
发布于 2009-12-02 12:43:22
我对这种方法不起作用并不感到惊讶,我也看不到一个自然的语义解释,比如活动模式。当您看到Foo
模式时,如何知道要使用哪个实例?您是否可以为Foo
和Bar
情况提供不同的实例(因此是不完全的模式匹配)?这里的问题似乎没有一个优雅的解决方案。老实说,我很惊讶,即使是静态情况也可以工作,而且我在规范中没有看到任何将活动模式定义为任何类型的成员的内容。
发布于 2010-02-18 15:02:40
成员识别器似乎从1.9.9.9版本开始就被淘汰了。即使对于静态成员也是如此。我认为这是一个遗憾,因为它允许识别器重载。我可以有一个类型,MemberInfo等的'Name‘识别器。现在我需要一个' Type _Name’。'Member_Name‘等,以避免命名冲突。只是“名字”更好。
https://stackoverflow.com/questions/1830548
复制相似问题