Scala中的ADT亚型

Scala中的ADT亚型,scala,generics,algebraic-data-types,Scala,Generics,Algebraic Data Types,对于Scala中使用的ADT模式,是否存在与OO概念相同的子类型化? 特别是,我想向更特殊的类型添加方法。例如,给定一个通用列表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]

对于Scala中使用的ADT模式,是否存在与OO概念相同的子类型化? 特别是,我想向更特殊的类型添加方法。例如,给定一个通用列表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与泛型Cons关联起来,这样它就可以在模式匹配中工作,因此,为List定义的泛型方法不适用于DuckList。

使用类型类模式

一个例子,考虑如何实现。它将一个方法--

compare
--添加到一组封闭类中,但它不是通过直接添加该方法来实现的,而是为该特定类提供一个具有此类方法的实例<代码>排序[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

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

“此转换是隐式提供的,因此用户无需显式传递。”。什么转换?这只是一个隐式参数,对吗?没有转换。@Felix是的,我说错了。所以这个解决方案允许在定义(以前定义的)泛型方法的类型特定行为的意义上进行扩展,但实际上不允许定义新方法,对吗?因此,在我的示例中,我只能实现
feed
方法,如果该方法在
List
中已经可用,至少可以作为一个抽象方法。@estolua它允许根据该类型的公共方法为该类型定义新方法。如果您的意思是调用
list.feed
而不是
feed(list)
,那么这种区别是不相关的。出于语法方面的考虑,您可以使用隐式转换(也出现在
排序
上),但这是另一个问题。
def sorted[B >: A](implicit ord: math.Ordering[B]): List[A]