ฉันรู้สึกอึดอัดกับไวยากรณ์ของ Haskell


9

ไวยากรณ์ส่วนใหญ่ของ Haskell มีความบริสุทธิ์ แต่ไวยากรณ์บันทึกดูน่าเกลียด มันอึดอัด มันให้ความรู้สึกบางอย่างผสมกับ C มันต้องใช้เครื่องหมายจุลภาคและวงเล็บ Haskell มีแถบแยกตามบรรทัด ดังนั้นมันดู verbose มากเกินกว่าที่มันต้องการ ทำไมมันถูกออกแบบมาในแบบนั้น?


4
สำหรับฉัน Haskell ทุกคนรู้สึกแปลก ๆ ฉันจะทำอย่างไร
งาน

7
คุณไม่ได้อยู่คนเดียว มีคนไม่กี่คนที่บ่นเกี่ยวกับบันทึก (ชาติปัจจุบัน)

Eonil: หากคุณเกลียดการบันทึกไวยากรณ์จริงๆคุณสามารถปิดการใช้งานได้ด้วยส่วนขยาย {- # NoTraditionalRecordSyntax # -} GHC
Daniel Díaz Carrete

คำตอบ:


8

ในขณะที่ฉันไม่ได้อยู่ในผู้รับมอบหมายการออกแบบฉันคิดว่าไวยากรณ์ของรูปทรงนั้นสอดคล้องกับรายการของไวยากรณ์ ไวยากรณ์การเอ็กซ์พอร์ตโมดูลใช้เครื่องหมายจุลภาคด้วยเช่นกันซึ่งเป็นสถานที่จริงเท่านั้นที่ใช้โครงร่างคือการประกาศระดับสูงสุดที่มีคำสั่งและเครื่องหมายกำกับ

ด้านบนของที่ได้รับ

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"

อืมมม ไม่setLผันแปรเฉลี่ย ?? หากไม่มี IO มันยากที่จะเข้าใจ ...
Eonil

2
ไม่เลยคุณจะได้รับสำเนา (การแชร์) บันทึกอีกครั้งโดยมีการเปลี่ยนแปลงเขตข้อมูลเดียวเช่นเดียวกับไวยากรณ์ของการบันทึก ไม่มีความผันแปรหรือความโปร่งใสของการอ้างอิงที่เกี่ยวข้อง
barsoap
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.