次のようなばかげた小さなケース クラスがあるとします。
case class Foo(name: String, other: Foo)
is 、 is 、isなどa
をb
不変に定義するにはどうすればよいですか? scala は「結び目を作る」方法を提供していますか? 私はこのようなことをしたいと思います:a.other
b
b.other
a
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
式に含まれている場所、または最上位にある場所。
または、Haskell の自動 letrec 機能を悪用せずに:
(a, b) = fix (\ ~(a', b') -> Foo "a" b', Foo "b" a')
遅延パターン に注意してください。これは~(a', b')
重要です。