给定一棵具有以下形状的树:
enum Tree
case Node(left: Tree, right:Tree)
case Leaf
是否可以创建一个值
n:Node
,使得n.left == n || n.right == n
?
val n:Node = Node(n,n)
不起作用,但是是否有编译时保证不存在这样的值?对于一般的案例类是否有这样的保证(即 a.a==a
可能永远不会适用于任何 a:A
,其中 A
是一个案例类)?
一些额外的背景: 我遇到这个问题是因为我需要知道
Tree
的集合是否构成一棵结构良好的树,并且在某一时刻想要检查该集合是否有任何引用自身的 Node
.
scala>
sealed trait Tree
case class Node(left: Tree, right: Tree) extends Tree
case object Leaf extends Tree
scala>
defined trait Tree
defined class Node
defined object Leaf
scala> Node(Leaf, Leaf)
res1: Node = Node(Leaf,Leaf)
scala> Node(Leaf, Node(Leaf, Leaf))
res2: Node = Node(Leaf,Node(Leaf,Leaf))