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类型的值. 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |