letrec in Scala? (Unveränderliche Weise, den Knoten zu binden?)

Angenommen, ich habe so eine dumme kleine Fallklasse:

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

Wie kann ich definierena undb unveränderlich so, dassa.other istb, undb.other ista? Bietet Scala eine Möglichkeit dazu?"binde den Knoten"? Ich würde gerne so etwas machen:

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

Möglichkeiten

In Haskell würde ich das machen:

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

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

Wo die Bindungen sinda undb sind in demselben enthaltenlet Ausdruck oder auf der obersten Ebene.

Oder, ohne die automagischen Letrec-Funktionen von Haskell zu missbrauchen:

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

Beachten Sie das faule Muster,~(a', b'), das ist wichtig.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage