你不能有这样的递归类型别名。但是如果你创建一个单独的类,那就没问题了:
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
在这种情况下)。