Giả sử tôi có một ngu ngốc ít trường hợp lớp như vậy:letrec in Scala? ("? Tie hôn" cách bất di bất dịch để)
case class Foo(name: String, other: Foo)
Làm thế nào tôi có thể xác định a
và b
bất biến mà a.other
là b
và b.other
là a
? Scala có cung cấp cách nào đó cho "tie the knot" không? Tôi muốn làm điều gì đó như thế này:
val (a, b): (Foo, Foo) = (Foo("a", b), Foo("b", a)) // Doesn't work.
khả năng
Trong Haskell tôi sẽ làm điều này:
data Foo = Foo { name :: String, other :: Foo }
a = Foo "a" b
b = Foo "b" a
đâu bindings để a
và b
được chứa trong cùng biểu hiện let
hoặc ở cấp cao nhất.
Hoặc, không lạm dụng khả năng letrec automagical Haskell của:
(a, b) = fix (\ ~(a', b') -> Foo "a" b', Foo "b" a')
Lưu ý mô hình lười biếng, ~(a', b')
, đó là quan trọng.
Tôi tự hỏi có bao nhiêu công cụ tìm kiếm sẽ bắt đầu tìm kiếm câu hỏi này cho "đám cưới" ... –
Câu hỏi này ít nhiều là một bản sao của http://stackoverflow.com/questions/7507965/instantiating-immutable-paired-objects. Ngoài ra, nếu nó có thể với các trường hợp các lớp 'toString' sẽ recurse mãi mãi –
@LuigiPlinge rằng giải pháp lây nhiễm định nghĩa của lớp chính nó. Tôi muốn thấy một giải pháp mà 'Foo' không được phát hiện. 'toString' thực sự sẽ tái chế vĩnh viễn. –