Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#作为非静态成员的活动模式_F#_Member_Active Pattern - Fatal编程技术网

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

F#作为非静态成员的活动模式,f#,member,active-pattern,F#,Member,Active Pattern,我不确定是否允许使用非静态公共成员活动模式,但您可以在没有编译器抱怨的情况下定义它们。如果允许,与之匹配的语法是什么?编译器为FooBar2.doSomething中的Foo提供了一个类型不匹配。需要一个'a->Choice给定'a->'d->Choice 这不起作用我并不感到惊讶,我也看不到对活动模式的自然语义解释。当您看到Foo模式时,如何知道要使用哪个实例?您是否可以为Foo和Bar案例提供不同的实例(因此模式匹配不完整)?这里的问题似乎没有一个优雅的解决方案。老实说,我很惊讶,即使是静态

我不确定是否允许使用非静态公共成员活动模式,但您可以在没有编译器抱怨的情况下定义它们。如果允许,与之匹配的语法是什么?编译器为FooBar2.doSomething中的Foo提供了一个类型不匹配。需要一个
'a->Choice
给定
'a->'d->Choice


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

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

自1.9.9.9版以来,成员识别器似乎已过时。即使是静态成员。我认为这是一个遗憾,因为它允许识别器过载。我可以为类型、成员信息等设置一个“名称”识别器。现在我需要一个“类型名称”成员名称等,以避免命名冲突。只有“Name”更好。

Hmm,没有至少一个静态版本迫使我不得不使用模块,而不仅仅是名称空间。我唯一关心的是在这两个区域中使用相同的名称/行为。这可能会导致重复命名。我宁愿把我所有的网络代码都保存在名称空间网络中,也不要有一个模块网络,我相信CLR会变成一个全静态的类。所以我最终会得到类似MyApp.Network.ModuleName.Identifier的东西
// 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 -> ()