Supongamos que tengo un poco de clase estúpido caso así:letrec en Scala? ("? Atar el nudo" forma inmutable que)
case class Foo(name: String, other: Foo)
¿Cómo puedo definir a
y b
inmutable tal que a.other
es b
, y b.other
es a
? ¿Scala proporciona alguna forma de "tie the knot"? Me gustaría hacer algo como esto:
val (a, b): (Foo, Foo) = (Foo("a", b), Foo("b", a)) // Doesn't work.
Posibilidades
En Haskell Me gustaría hacer esto:
data Foo = Foo { name :: String, other :: Foo }
a = Foo "a" b
b = Foo "b" a
Donde los enlaces a a
y b
están contenidas en el la misma expresión let
, o en el nivel superior.
O, sin abusar de las capacidades letrec automágicas de Haskell:
(a, b) = fix (\ ~(a', b') -> Foo "a" b', Foo "b" a')
Nota el patrón perezoso, ~(a', b')
, eso es importante.
Me pregunto cuántos motores de búsqueda ahora se empieza a encontrar esta pregunta para "boda" ... –
Esta pregunta es más o menos un duplicado de http://stackoverflow.com/questions/7507965/instantiating-immutable-paired-objects. Además, si fuera posible con clases de casos, 'toString' recurriría para siempre –
@LuigiPlinge. Esa solución infecta la definición de la clase en sí misma. Me gustaría ver una solución donde 'Foo' no esté dañado. 'toString' de hecho se repetirá para siempre. –