4

我不确定是否允许非静态公共成员活动模式,但您可以在编译器不抱怨的情况下定义它们。如果他们被允许,匹配一个的语法是什么?编译器给了我 FooBar2.doSomething 中 Foo 的类型不匹配。期待一个'a -> Choice<'b,'c>给定的'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 -> ()
4

3 回答 3

6

不应将活动模式用作成员。这些完全编译的事实是我们将修复的编译器错误(感谢报告:))。使用本地或模块绑定的“let”来定义活动模式。

于 2009-12-02T17:05:15.667 回答
3

我对这不起作用并不感到惊讶,而且我看不到例如活动模式的自然语义解释。Foo当您看到该模式时,您如何知道要使用哪个实例?你能有不同的情况FooBar情况(因此模式匹配不完整)吗?这里的问题似乎没有一个优雅的解决方案。老实说,我很惊讶即使是静态案例也能正常工作,而且我在规范中没有看到任何内容将活动模式定义为任何类型的成员。

于 2009-12-02T04:43:22.490 回答
1

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.

于 2010-02-18T07:02:39.847 回答