相当于Scala“;“案例类”;在F#
我正在寻找Scala中可用的F#形式的“案例类” 当您希望创建带有方法和字段的自定义类,并且仍然能够将它们用于模式匹配时,Cases类非常有用,如Scala网站的本部分所述相当于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
有人知道在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
上定义的方法是不可变的术语中添加For
子类型。然后您必须更改许多模式匹配的术语
的代码
//定义不同术语类型的类
[和活动模式
您可以进一步参考Don Syme。我试图在MSDN上查看如何将成员方法添加到描述的联合中,但找不到它。您能举个例子吗?@JSmaga,请查看我关于将方法添加到DU类型的答案。回答很好!谢谢。我仍然认为在Scala中更容易,我不知道F#稍后是否会包含此功能。