是否可以使用带有类型参数的`case object`?

Abe*_*ker 10 scala

我目前正在学习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)

否则,将其保留为案例类.

  • 也许链接范式的例子.https://github.com/scala/scala/blob/v2.11.5/src/library/scala/Option.scala#L345 (3认同)