带案例类的双向引用

Jim*_*Jim 9 scala case-class

是否可以在案例类中实现双向树.这看起来应该很容易,但我很难过

case class Node(name:String, parent:Option[Node], children:List[Node])
Run Code Online (Sandbox Code Playgroud)

我想添加一个孩子(并获得一个新的根) - 类似的东西

def addChild(n:String):Node = {
  Node(name, parent, Node(n, Some(this), Nil)::children)
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为孩子中的"父母"将不再引用将孩子列为孩子的节点.这是可能的不可变列表和案例类?

根据下面给出的答案

case class Node(name: String, parent: () => Option[Node], children: List[Node]) {
  def makeChild(name: String) = {
    lazy val newParent:Node = Node(this.name, this.parent, kid :: this.children)
    lazy val kid:Node = Node(name, () => Some(newParent), Nil)
    newParent
  }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ric 9

我最近在Twitter上向@jamesiry提出了同样的问题:-).

他的回答是:

sealed abstract class Tree[T]
case class Node[T](left : Tree[T], right : Tree[T]) extends Tree[T]
case class Leaf[T](value : T, parent : () => Tree[T]) extends Tree[T]

def make = {
   lazy val root = Node(left, right)
   lazy val left : Leaf[Int] = Leaf(1, () => root)
   lazy val right : Leaf[Int] = Leaf(2, () => root)
   root
}
Run Code Online (Sandbox Code Playgroud)