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) も定義する必要があります。ケース クラスは (ケースごとの) 継承をサポートしていないため、DuckCons をジェネリックに関連付ける方法はありません。パターン マッチングで機能するという短所があるため、List 用に定義されたジェネリック メソッドは DuckList では機能しません。