letrec em Scala? (Maneira imutável de "amarrar o nó?")

Suponha que eu tenha uma pequena classe de casos assim:

case class Foo(name: String, other: Foo)

Como posso definira eb imutavelmente tal quea.other ébeb.other éa? Scala fornece alguma maneira de"amarre o nó"? Eu gostaria de fazer algo assim:

val (a, b): (Foo, Foo) = (Foo("a", b), Foo("b", a)) // Doesn't work.

Possibilidades

Em Haskell eu faria isso:

data Foo = Foo { name :: String, other :: Foo }

a = Foo "a" b
b = Foo "b" a

Onde as ligações paraa eb estão contidos no mesmolet expressão, ou no nível superior.

Ou, sem abusar dos recursos automagical da letrec de Haskell:

(a, b) = fix (\ ~(a', b') -> Foo "a" b', Foo "b" a')

Observe o padrão preguiçoso~(a', b'), isso é importante.

questionAnswers(1)

yourAnswerToTheQuestion