letrec в Scala? (Неизменяемый способ «связать себя узами брака?»)

Предположим, у меня есть дурацкий маленький 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'), это важно.

10
задан mergeconflict 18 June 2012 в 13:42
поделиться