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
éb
eb.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.