そのような再帰的な型エイリアスを持つことはできません。ただし、別のクラスを作成する場合は問題ありません。
case class Test[+T](value: Either[List[Test[T]], T]) {
def flatten: List[T] = value match {
case Left(list) => list.flatMap(_.flatten);
case Right(element) => List(element);
}
}
(プログラミングで最も興味深いクラスは、実際には再帰的です。)
あなたのような再帰的なエイリアスを持つことができない理由は、何かが型を持っているかどうかを知るためにtype
、コンパイラがエイリアスを展開する必要があるからです。type
しかし、次のような再帰型エイリアス
type test = Either[List[test], Int]
無限に展開します:
Either[List[test], Int]
Either[List[Either[List[test], Int]], Int]
Either[List[Either[List[Either[List[test], Int]], Int]], Int]
...
クラスでは、再帰的な値を適切に定義された型 (Test[T]
この例のように) に "ラップ" するため、これは起こりません。型の「拡張」は、内部にあるものを参照する場合にのみ発生します (value
この場合)。