Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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
相当于Scala“;“案例类”;在F#_Scala_F#_Functional Programming - Fatal编程技术网

相当于Scala“;“案例类”;在F#

相当于Scala“;“案例类”;在F#,scala,f#,functional-programming,Scala,F#,Functional Programming,我正在寻找Scala中可用的F#形式的“案例类” 当您希望创建带有方法和字段的自定义类,并且仍然能够将它们用于模式匹配时,Cases类非常有用,如Scala网站的本部分所述 有人知道在F#?受歧视的工会中是否存在同样的情况吗?您可以向它们添加成员方法。或者,您可以在现有类上使用活动模式。正如Brian提到的,有两种模式匹配方法:1。歧视工会和2。现有类型上的活动模式 让我们从这个Scala示例开始: 抽象类术语 case类Var(名称:String)扩展了术语 case-class-Fun(ar

我正在寻找Scala中可用的F#形式的“案例类”

当您希望创建带有方法和字段的自定义类,并且仍然能够将它们用于模式匹配时,Cases类非常有用,如Scala网站的本部分所述


有人知道在F#?

受歧视的工会中是否存在同样的情况吗?您可以向它们添加成员方法。或者,您可以在现有类上使用活动模式。

正如Brian提到的,有两种模式匹配方法:1。歧视工会和2。现有类型上的活动模式

让我们从这个Scala示例开始:

抽象类术语
case类Var(名称:String)扩展了术语
case-class-Fun(arg:String,body:Term)扩展了Term
案例类应用程序(f:术语,v:术语)扩展术语
这种OO设计可以转换为F#中的歧视联合(DU):

类型术语=
字符串变量
|字符串*术语的乐趣
|学期申请表*学期申请表
基于此DU,您可以匹配一个
术语
值来查找它是什么子类型:

let eval(t:Term)=
匹配
|变量(名称)->。。。
|乐趣(段落,身体)->。。。
|应用程序(t1,t2)->。。。
请注意,您可以在此
术语
类型上定义方法和属性:

类型术语=
字符串变量
|字符串*术语的乐趣
|学期申请表*学期申请表
具有
成员x.Type()=
将x与
|变量->0
|乐趣->1
|应用程序->2
现在,区别来了:

  • 不能在其子类型上定义方法:
    Var
    Fun
    App

  • 您可以在
    Term
    上定义的方法是不可变的

  • 一旦定义了DU,就不可能对其进行扩展。考虑一下,您现在需要在
    术语中添加
    For
    子类型。然后您必须更改许多模式匹配的
    术语
    的代码

  • 而在面向对象设计中,这不是一个问题。因为新的子类型可以携带自己的实现

  • 在F#中,当您想要在子类型上构建简洁的类型匹配时,应该首先考虑DU。但它也有明显的限制。我认为活动模式匹配更等同于Scala中的case类(我只读了一点Scala):

    //定义不同术语类型的类
    [和活动模式


    您可以进一步参考Don Syme。

    我试图在MSDN上查看如何将成员方法添加到描述的联合中,但找不到它。您能举个例子吗?@JSmaga,请查看我关于将方法添加到DU类型的答案。回答很好!谢谢。我仍然认为在Scala中更容易,我不知道F#稍后是否会包含此功能。