Supponiamo che io sono uno stupido po 'di classe caso in questo modo:letrec in Scala? ("? Legare il nodo" via Immutabile a)
case class Foo(name: String, other: Foo)
Come posso definire a
e b
immutabilmente tale che a.other
è b
, e b.other
è a
? Scala fornisce un modo per "tie the knot"? Mi piacerebbe fare qualcosa di simile:
val (a, b): (Foo, Foo) = (Foo("a", b), Foo("b", a)) // Doesn't work.
possibilità
In Haskell farei questo:
data Foo = Foo { name :: String, other :: Foo }
a = Foo "a" b
b = Foo "b" a
Dove le associazioni a a
e b
sono contenute nel stessa espressione let
o al livello superiore.
Oppure, senza abusare capacità letrec automagici di Haskell:
(a, b) = fix (\ ~(a', b') -> Foo "a" b', Foo "b" a')
Nota il modello pigro, ~(a', b')
, questo è importante.
Mi chiedo come molti motori di ricerca sarà ora iniziare a trovare questa domanda per "matrimonio" ... –
Questa domanda è più o meno un duplicato di http://stackoverflow.com/questions/7507965/instantiating-immutable-paired-objects. Inoltre, se fosse possibile con le classi dei casi, 'toString 'avrebbe recidato per sempre –
@LuigiPlinge che la soluzione infetti la definizione della classe stessa. Mi piacerebbe vedere una soluzione in cui 'Foo' non è disponibile. 'toString' sarebbe infatti retrocedere per sempre. –