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

Scala中的ADT子类型

发布时间:2020-12-16 18:41:06 所属栏目:安全 来源:网络整理
导读:是否有与 Scala中使用的ADT模式的子类型的OO概念等效? 特别是我想将方法??添加到更专业的类型.例如,给定一个通用的List ADT: sealed trait List[+A]case class Cons[+A](h: A,t: List[A]) extends List[A]case object Nil[Nothing] 我想为特定类型的列表定
是否有与 Scala中使用的ADT模式的子类型的OO概念等效?
特别是我想将方法??添加到更专业的类型.例如,给定一个通用的List ADT:

sealed trait List[+A]
case class Cons[+A](h: A,t: List[A]) extends List[A]
case object Nil[Nothing]

我想为特定类型的列表定义新方法:

sealed trait List[+A]
sealed trait DuckList extends List[Duck] {
    def feed(l: DuckList) = ...
}

但是我还必须为这些新类型定义特殊的数据构造函数(DuckCons,DuckNil),并且由于case类不支持(case-to-case)继承,所以没有办法将DuckCons与泛型相关联这样可以在模式匹配中工作,因此为List定义的泛型方法不适用于DuckList.

解决方法

使用类型类模式.

举一个例子,考虑如何实现Ordering.它添加了一个方法 – 比较 – 与一组封闭类,但它不是通过直接添加方法,而是提供一个具有该特定类的方法的实例.订购[Int],继续该示例,实现如下:

trait IntOrdering extends Ordering[Int] {
  def compare(x: Int,y: Int) =
    if (x < y) -1
    else if (x == y) 0
    else 1
}
implicit object Int extends IntOrdering

也就是说,对象Ordering.Int(对于此对象在Ordering中)实现了一个方法比较,它将两个Int作为参数.隐式提供此对象,因此用户无需显式传递它. List的排序方法利用了这个:

def sorted[B >: A](implicit ord: math.Ordering[B]): List[A]

然后它可以调用ord.compare对列表的实例进行排序.我鼓励你看看订购,了解它在做什么.

(编辑:李大同)

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

    推荐文章
      热点阅读