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. 解决方法
使用类型类模式.
举一个例子,考虑如何实现 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对列表的实例进行排序.我鼓励你看看订购,了解它在做什么. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容