我目前正在学习Scala,并想复制这个Haskell代数数据类型:
data Tree = Empty
| Leaf Int
| Node Tree Tree
这就是我在Scala中提出的:
sealed trait Tree[T]
case class Empty[T]() extends Tree[T]
case class Leaf[T](value: T) extends Tree[T]
case class Node[T](left: Tree[T], right: Tree[T]) extends Tree[T]
然而,有人告诉我,我应该使用case object
Empty
,我认为这是真的,因为它没有参数 - 但是它再次需要一个类型参数。
我尝试了以下但没有编译:
case object Empty[T] extends Tree[T]
case object Empty extends Tree[T]
case object Empty extends Tree
所以我想知道是否有办法在这个例子中使用case object
。
答案 0 :(得分:15)
单身人士不可能是通用的,因为他们中只有一个是通用的。如果您希望Tree
具有协变性(即Tree[Int]
是[{1}}的子类型),那么您可以将类型定义为
Tree[Any]
否则,请将其保留为案例类。