Haskell plak sözdiziminden rahatsızlık duyuyorum


9

Haskell sözdiziminin çoğu saflık güzelliğine sahiptir. Ancak kayıt sözdizimi çirkin görünüyor. Rahatsız. C ile bir çeşit karışım hisseder. Virgül ve diş telleri gerektirir. Haskell'in sekmesi, çizgi tabanlı ayrımı vardır. Bu yüzden başlangıçta gerekenden çok ayrıntılı görünüyor. Neden bu şekilde tasarlandı?


4
Bana göre tüm Haskell garip geliyor. Ne yapabilirim?
İş

7
Yalnız değilsin. Oldukça az sayıda kişi kayıtlardan şikayet ediyor (mevcut enkarnasyon).

Eonil: Kayıt sözdiziminden gerçekten nefret ediyorsanız , {- # NoTraditionalRecordSyntax # -} GHC uzantısıyla devre dışı bırakabilirsiniz.
Daniel Díaz Carrete

Yanıtlar:


8

Tasarım komitesinde olmasam da, kayıt sözdiziminin liste sözdizimi ile tutarlı olacak şekilde şekillendiğini düşünüyorum. Modül dışa aktarım sözdizimi de virgül kullanır, mizanpajın kullanıldığı tek gerçek yer, cümle ve gösterimin yapıldığı üst düzey bildirimlerdir.

Bunun üzerine, verilen

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

yazı

fnord x = x { bar = 4 }

parantez olmadan sözdiziminin geri kalanıyla çakışır ve

fnord x = x
    bar = 4

sözdizimini oldukça kırılgan hale getirir. Yanlış yere bir "where" ekleyin ve kodunuz tamamen farklı bir şey anlamına gelir.

Haskell'deki kayıtların durumundan memnun değilseniz (ve bununla yalnız kalmazsanız) , fclabels'e veya HList veya greyfurt kayıtları gibi ayrıntılı tip hackery'e göz atmanızı öneririm (son ikisi kalbin zayıflığı için değil, aynı zamanda inanılmaz derecede güçlü)

fclabels yazmanıza izin verir (yay pointfree)

fnord = setL bar 4

Hem de

getBar = getL bar

Üstelik etiket oluşturan gerçek raison d'etre:

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

 moveToAmsterdam :: Person -> Person
 moveToAmsterdam = setL (city . place) "Amsterdam"

Hmm. Does setLortalama Değişebilir ?? IO olmadan mı?
Anlaması

2
Hiç de değil, tıpkı kayıt sözdiziminde olduğu gibi, tek bir alan değiştiğinde kaydın başka bir (paylaşım) kopyasını alacaksınız. Değişebilirlik veya referans şeffaflığının kırılması söz konusu değildir.
barsoap
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.