加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

F#和Scala中的ADT

发布时间:2020-12-16 18:23:29 所属栏目:安全 来源:网络整理
导读:F#和 Scala中ADT之间的主要区别是什么?有没有F#的ADT可以做但Scala的ADT不能(反之亦然)? 解决方法 从概念上讲,我认为两种语言都提供相同的功能 – 在F#中你可以使用有区别的联合声明ADT,而在Scala中,你可以使用case类. Scala中使用类的声明可能会比F#版本
F#和 Scala中ADT之间的主要区别是什么?有没有F#的ADT可以做但Scala的ADT不能(反之亦然)?

解决方法

从概念上讲,我认为两种语言都提供相同的功能 – 在F#中你可以使用有区别的联合声明ADT,而在Scala中,你可以使用case类. Scala中使用类的声明可能会比F#版本稍长一些(正如Yin Zhu所指出的那样),但是你可以在两种语言中使用类似优点的模式匹配.

以下是简化术语的示例(from this article):

def simplify(term: Term) = term match {
  case Mul(Num(0),x) => Num(0)
  case Mul(Num(1),x) => x
  case _ => term
}

使用匹配的F#中的相同代码看起来非常相似:

let simplify term = 
  match term with 
  | Mul(Num(0),x) -> Num(0)
  | Mul(Num(1),x) -> x
  | _ -> term

差异我认为在更高级(相关)功能方面存在一些差异.

>在Scala中,每个案例也是一个类型,因此您可以定义一个以Num或Mul作为参数的方法.在F#中,这是不可能的,因为Num和Mul只是Term类型的构造函数.我想这可能有时很有用,但大部分时间,你都会使用Term类型的值.
>与上一点相关 – 在Scala中,您还可以为单个案例定义方法.例如,您可以在Num类中定义方法.在F#中,所有成员都必须是Term类型的成员.
>在F#中,您可以使用活动模式隐藏类型的内部表示(例如,从模块导出时).这对于库设计非常有用.例如,您可以定义活动模式:

val (|Mul|_|) // return Some(..) if Term represents multiplication
val (|Num|_|) // return Some(..) if Term represents number

内部表示可以随着时间的推移而不影响库接口,因此您可以像这样实现接口:

type Term = Binary of string * Term * Term | Num of int
let (|Num|_|) = function Num n -> Some n | _ -> None 
let (|Mul|_|) = function Binary("*",a,b) -> Some(a,b) | _ -> None

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读