假设我有一个像这样的愚蠢的小案例类:
case class Foo(name: String, other: Foo)
我怎样才能定义a
和b
不可变的那样a.other
isb
和b.other
is 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
表达式中,或者在顶层。
或者,在不滥用 Haskell 的自动 letrec 功能的情况下:
(a, b) = fix (\ ~(a', b') -> Foo "a" b', Foo "b" a')
注意惰性模式,~(a', b')
这很重要。