发布
社区首页 >问答首页 >作为非静态成员的F#活动模式

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

Stack Overflow用户
提问于 2009-12-02 11:52:59
回答 3查看 520关注 0票数 4

我不确定是否允许非静态的公共成员活动模式,但是你可以定义它们而不会引起编译器的抱怨。如果它们是被允许的,那么匹配它们的语法是什么?编译器给了我一个与FooBar2.doSomething中的Foo不匹配的类型。需要给定'a -> 'd -> Choice<unit,unit>'a -> Choice<'b,'c>

代码语言:javascript
代码运行次数:0
复制
// 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 -> ()
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-03 01:05:16

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

票数 6
EN

Stack Overflow用户

发布于 2009-12-02 12:43:22

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

票数 3
EN

Stack Overflow用户

发布于 2010-02-18 15:02:40

成员识别器似乎从1.9.9.9版本开始就被淘汰了。即使对于静态成员也是如此。我认为这是一个遗憾,因为它允许识别器重载。我可以有一个类型,MemberInfo等的'Name‘识别器。现在我需要一个' Type _Name’。'Member_Name‘等,以避免命名冲突。只是“名字”更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1830548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档