Двунаправленная ссылка с классами case

Возможно ли реализовать двунаправленное дерево в case class. Кажется, это должно быть легко, но я в тупике

case class Node(name:String, parent:Option[Node], children:List[Node])

Я хочу добавить потомка (и получить новый корень) - что-то вроде

def addChild(n:String):Node = {
  Node(name, parent, Node(n, Some(this), Nil)::children)
}

Но это не сработает, потому что "родительский" в child больше не будет ссылаться на узел, в котором ребенок указан как дочерний. Возможно ли это с неизменяемыми списками и классами вариантов?

На основании ответа, приведенного ниже

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
  }
}
9
задан Jim 16 September 2010 в 21:22
поделиться