F#活动模式作为非静态成员

时间:2009-12-02 03:52:59

标签: f# member active-pattern

我不确定是否允许使用非静态公共成员活动模式,但您可以在没有编译器抱怨的情况下定义它们。如果允许它们与一个匹配的语法是什么?编译器在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 -> ()

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

我并不感到惊讶,这不起作用,我无法看到自然的语义解释,例如活动模式。当您看到Foo模式时,您如何知道要使用哪个实例?您是否可以为FooBar案例设置不同的实例(因此不完整的模式匹配)?这里的问题似乎没有优雅的解决方案。说实话,我很惊讶甚至静态情况都有效,我在规范中没有看到任何形式的活动模式的定义。

答案 2 :(得分:0)

自1.9.9.9版以来,成员识别器似乎已经出局。即使是静态成员。我认为这是一种耻辱,因为它允许识别器重载。我可以为Type,MemberInfo等设置一个'Name'识别器。现在我需要一个'Type_Name'。 'Member_Name'等以避免命名冲突。只是'姓名'更好。