Предположим, у меня есть глупый маленький класс case:
case class Foo(name: String, other: Foo)
Как я могу определить a
и b
неизменяемо, чтобы a.other
было b
, а b.other
было a
? Предоставляет ли Scala способ "связать себя узами брака"? Я хотел бы сделать что-то вроде этого:
val (a, b): (Foo, Foo) = (Foo("a", b), Foo("b", a)) // Doesn't work.
Возможности
В Haskell я бы сделал так:
data Foo = Foo { name :: String, other :: Foo }
a = Foo "a" b
b = Foo "b" a
Где привязки к a
и b
содержатся в одном и том же выражении let
или на верхнем уровне.
Или, не злоупотребляя автоматическими возможностями letrec в Haskell:
(a, b) = fix (\ ~(a', b') -> Foo "a" b', Foo "b" a')
Обратите внимание на ленивый шаблон, ~(a', b')
, это важно.
toString
всегда рекурсивно - person Luigi Plinge   schedule 06.06.2012Foo
не изменяется.toString
действительно будет рекурсивным навсегда. - person Dan Burton   schedule 06.06.2012