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.