Saya merasakan sesuatu yang tidak nyaman dengan sintaksis rekaman Haskell

9

Sebagian besar sintaksis Haskell memiliki keindahan kemurnian. Tapi sintaksisnya terlihat jelek. Itu tidak nyaman. Rasanya semacam campuran dengan C. Itu membutuhkan koma dan kawat gigi. Haskell memiliki tab, pemisahan berdasarkan garis. Jadi itu terlihat terlalu bertele-tele daripada yang dibutuhkannya. Mengapa ini dirancang sedemikian rupa?

Eonil
sumber
4
Bagi saya semua Haskell terasa aneh. Apa yang dapat saya?
Pekerjaan
7
Kamu tidak sendirian Cukup banyak orang mengeluh tentang (inkarnasi saat ini) catatan.
Eonil: Jika Anda benar - benar membenci sintaksis rekaman, Anda dapat menonaktifkannya dengan ekstensi GHC {- # NoTraditionalRecordSyntax # -}.
Daniel Díaz Carrete

Jawaban:

8

Sementara saya tidak berada di komite desain, saya rasa bahwa sintaks record dibentuk agar konsisten dengan sintaksis daftar. Sintaks ekspor modul menggunakan koma juga, satu-satunya tempat nyata di mana tata letak digunakan adalah deklarasi tingkat atas, tempat klausa dan notasi.

Selain itu, diberikan

data Foo = Foo {bar :: Int, baz :: Int}

penulisan

fnord x = x { bar = 4 }

tanpa kawat gigi akan berbenturan dengan sisa sintaks, dan menggunakan tata letak, seperti

fnord x = x
    bar = 4

akan membuat sintaks cukup rapuh. Tambahkan "di mana" di tempat yang salah dan kode Anda berarti sesuatu yang sama sekali berbeda.

Jika Anda tidak puas dengan status catatan di Haskell (dan Anda tidak akan sendirian dengan itu), saya sarankan Anda melihat fclabels atau bahkan peretasan typeclass yang rumit seperti HList atau catatan grapefruit (dua yang terakhir tidak menjadi untuk yang lemah hati, tetapi juga sangat kuat)

fclabels akan memungkinkan Anda untuk menulis (yay pointfree)

fnord = setL bar 4

sebaik

getBar = getL bar

di atas itu sebenarnya raison d'etre, yang menyusun label:

 data Person = Person { _place  :: Place, ... }
 data Place = Place { _city :: String, ... }

 moveToAmsterdam :: Person -> Person
 moveToAmsterdam = setL (city . place) "Amsterdam"
sabun batang
sumber
Hmm. Apakah setLbisa berubah? Tanpa IO? Sulit dimengerti ...
Eonil
2
Tidak sama sekali, Anda akan mendapatkan salinan (berbagi) lain dari catatan dengan satu bidang yang diubah, seperti halnya dengan sintaksis catatan. Tidak ada mutabilitas atau pemutusan transparansi referensial yang terlibat.
barsoap