สมมติว่าฉันมีคลาสเคสเล็ก ๆ ที่โง่เขลาเช่นนี้:
case class Foo(name: String, other: Foo)
ฉันจะกำหนด a
และ b
โดยไม่เปลี่ยนรูปได้อย่างไรว่า 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
เดียวกัน หรือที่ระดับบนสุด
หรือโดยไม่ใช้ความสามารถ 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