ในขณะที่ฉันไม่ได้อยู่ในผู้รับมอบหมายการออกแบบฉันคิดว่าไวยากรณ์ของรูปทรงนั้นสอดคล้องกับรายการของไวยากรณ์ ไวยากรณ์การเอ็กซ์พอร์ตโมดูลใช้เครื่องหมายจุลภาคด้วยเช่นกันซึ่งเป็นสถานที่จริงเท่านั้นที่ใช้โครงร่างคือการประกาศระดับสูงสุดที่มีคำสั่งและเครื่องหมายกำกับ
ด้านบนของที่ได้รับ
data Foo = Foo {bar :: Int, baz :: Int}
การเขียน
fnord x = x { bar = 4 }
ไม่มีวงเล็บปีกกาจะขัดแย้งกับส่วนที่เหลือของไวยากรณ์และการใช้รูปแบบเช่น
fnord x = x
bar = 4
จะทำให้ไวยากรณ์ค่อนข้างเปราะ เพิ่ม "ตำแหน่ง" ในตำแหน่งที่ไม่ถูกต้องและรหัสของคุณหมายถึงสิ่งที่แตกต่างอย่างสิ้นเชิง
หากคุณไม่พอใจกับสถานะของบันทึกใน Haskell (และคุณจะไม่โดดเดี่ยวกับเรื่องนั้น) ฉันขอแนะนำให้คุณดูที่fclabelsหรือแม้กระทั่งแฮ็คพิมพ์ typeclass ที่ซับซ้อนเช่นHListหรือgrapefruit-records (สองอันหลังไม่ใช่ สำหรับลมใจ แต่ยังทรงพลังอย่างมาก)
fclabels จะอนุญาตให้คุณเขียน (yay pointfree)
fnord = setL bar 4
เช่นกัน
getBar = getL bar
ด้านบนของ raison d'etre ที่แท้จริงซึ่งกำลังเขียนป้ายกำกับอยู่:
data Person = Person { _place :: Place, ... }
data Place = Place { _city :: String, ... }
moveToAmsterdam :: Person -> Person
moveToAmsterdam = setL (city . place) "Amsterdam"