我目前正在学习Scala,并希望复制这个Haskell代数数据类型:
data Tree = Empty
| Leaf Int
| Node Tree Tree
Run Code Online (Sandbox Code Playgroud)
这就是我在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]
Run Code Online (Sandbox Code Playgroud)
然而,有人告诉我,我应该使用case objectfor Empty,我认为它是真的,因为它不接受参数 - 但是它再次需要一个类型参数.
我尝试了以下但没有编译:
case object Empty[T] extends Tree[T]
case object Empty extends Tree[T]
case object Empty extends Tree
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否有一种方法可以case object在这个实例中使用.
col*_*evk 15
单身人士不能是通用的,因为他们只有一个.如果你想要Tree协变(即Tree[Int]是子类型Tree[Any]),那么你可以将类型定义为
sealed trait Tree[+T]
case object Empty extends Tree[Nothing]
Run Code Online (Sandbox Code Playgroud)
否则,将其保留为案例类.