SORU
20 Mart 2011, Pazar


Haskell kayıt sözdizimi

Haskell kayıt sözdizimi çirkin sözdizimi ve ad kirlenme yüzünden birçok kişi tarafından başka zarif bir dil üzerinde bir siğil olarak kabul edilir. Öte yandan sık sık pozisyon alarak alternatif daha kullanışlı.

Yerine böyle bir beyanı

data Foo = Foo { 
  fooID :: Int, 
  fooName :: String 
} deriving (Show)

Bu satırlar boyunca bir şey daha çekici olurdu gibi geliyor bana:

data Foo = Foo id   :: Int
               name :: String
               deriving (Show)

Kaçırıyorum iyi bir nedeni olmalı eminim, ama neden C-kayıt sözdizimi düzeni dayalı temiz bir yaklaşım içinde kabul edilmiştir?

Haskell gelecekteki sürümlerinde fooID foo yerine id foo yaz biz de boru hattı ad sorunu çözmek için bir şey var mı, ikincisi mi? (Uzun tip sınıfı dışında geçici çözümler mevcut dayalı.)

CEVAP
2 NİSAN 2011, CUMARTESİ


Peki eğer başka kimse deneyecek olursa, o zaman bu sorulara cevap (biraz daha dikkatle araştırılmış) başka bir bıçak alacağım.

tl;dr

Soru 1: sadece zarları. İkinci dereceden bir seçim oldu ve öyle kaldı.

Soru 2: Var (sayılır). Birkaç farklı partiler kesinlikle bu konu hakkında düşünüyordum.

İlgili ve ilginç bulduğum her cevap için çok uzun bir açıklama, bağlantılar ve tırnak etrafında tabanlı için okumaya devam edin.

Neden C-kayıt sözdizimi düzeni dayalı temiz bir yaklaşım içinde kabul edilmiştir?

Microsoft araştırmacıları History of Haskell bir kağıt yazdı. Kayıtları hakkında konuşuyor bölüm 5.6. Anlayışlı olan ilk küçük bir alıntı yapacağım:

Haskell erken sürümlerden en bariz eksikliklerden biri devamsızlık kayıtları, alanları adlı sunuyordu. Verilen kayıtlar uygulama son derece yararlıdır, neden ihmal edildi?

Bu Microsofties sonra kendi soruma cevap ver

En güçlü nedeni açık “” tasarım. haklıymış yok bu gibi görünüyor

Ayrıntılar için kağıt Kendin okuyabilirsin, ama Haskell sonunda kayıt sözdizimi nedeniyle kabul söylüyorlar "veri yapıları adlı alanlar için baskı".

Zaman Haskell 1.3 tasarımı 1993, kullanıcı devam ediyordu veri yapıları adlı alanlar için basınç güçlüydü, Komite sonunda minimalist bir tasarım benimsedi

Neden neden soruyorsun? Eğer erken Haskellers kendi yolunu olsaydı, anladığım kadarıyla, hiç kayıt sözdizimi geçirmiş olabiliriz. Amaç buydu anlaşılan itti üzerine Haskell tarafından kişilere zaten kullanılan C-gibi sözdizimi, ve daha fazla ilgi almak C-gibi şeylere Haskell yerine bir şeyler yapmak "Haskell".(Evet, bu son derece öznel bir yorum olduğunun farkındayım. Yanılıyor olabilirim, ama daha iyi cevaplar yokluğunda, bu beraberlik en iyi sonuç.)

Potansiyel bir şeye ad sorunu çözmek için vardır?

Öncelikle, herkes bir sorun olduğunu hisseder. Bir kaç hafta önce Racket meraklısı anlattı bana (ve diğerleri) sahip farklı fonksiyonları ile aynı adı kötü olacağını, çünkü karıştırdığı analizi "nedir işlevi, adlandırılmış ___?" Aslında, bir işlevi, ama çok değil. Fikir tür kesmesi karıştırdığı beri Haskell için ekstra zahmetli olabilir.

Hafif bir teğet, Microsofties Haskell'ın typeclasses hakkında ilginç şeyler var:

Mutlu bir tesadüf oldu Wadler ve Blotlama bu anahtar fikir üretmek oldu zamanlama dil tasarımı hala kesin oldu bir anda.

Bu Haskell bir zamanlar genç olduğunu unutma. Bazı kararlar oldukları için sadece yapıldı.

Neyse, birkaç ilginç bir yolu vardır bu "sorunu" ele olabilir:

Type Directed Name Resolution Haskell için önerilen bir değişiklik (yorum yukarıda bahsedilen). Sadece bu sayfa dil alanlarında pek çok dokunan görmek için okuyun. Sonuçta, kötü bir fikir değil. Düşünce bir sürü şeyler ile çatışma olmaz ki içine girmiştir. Ancak, yine de önemli ölçüde daha fazla ilgi almak için bunu gerektirir şimdi-(daha fazla)dil. olgun Haskell

Başka bir Microsoft kağıdı OO Haskell özellikle Haskell dilinin bir uzantısı desteklemek için önerdiği "geçici aşırı yükleme". Çok karmaşık, sadece kendin için Bölüm 4 kontrol etmek zorundasınız. Olayın özü için otomatik olarak (?) anlaması "" türleri ve türü için ek bir adım "iyileştirme", belli belirsiz seçici tırnak içinde özetlenen izleyin: . diyorlar ki kontrol eklemek için Vardır

Sınıf kısıtlaması verilen Has_m (Int -> C -> r) var bu kısıtlama ile eşleşen m için sadece bir örnek...tam bir seçim olmadığı için, bunu şimdi yapmalıyız, ve sırayla düzeltmeler 8* *Int olmak. Dolayısıyla fbeklenen türden alıyoruz: f :: C -> Int -> IO Int...[Bu] sadece bir tasarım seçimi, ve bir fikir dayalısınıf Has_m kapalıdır

Bunlar sana yardımcı olur, o zaman büyük, aksi takdirde sadece kağıt al ve oku eğer tutarsız alıntı için özür dilerim;. (Ama inandırıcı) karışık bir durum.

Chris Yapılması Şablon Haskell, Gordon Haskell kağıdı için belli belirsiz benzer bir şekilde duck typing in Haskell sağlamak için kullanmıştır (kullanma"," türleri) Vardır. Birkaç etkileşimli bir oturumu kendi sitesinden örnekler:

λ> flap ^. donald
*Flap flap flap*
λ> flap ^. chris
I'm flapping my arms!

fly :: (Has Flap duck) => duck -> IO ()
fly duck = do go; go; go where go = flap ^. duck

λ> fly donald
*Flap flap flap*
*Flap flap flap*
*Flap flap flap*

Bu alışılmadık sözdizimi/biraz klişe gerektirir, ve ben şahsen typeclasses sopa tercih ederim. Ama Chris şeref özgürce alanında aşağı-toprak çalışmaları yayınlamak için Yapılır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Anthony Le

    Anthony Le

    10 EKİM 2006
  • Kingsimba357

    Kingsimba357

    7 NİSAN 2008
  • Tech4Geeks

    Tech4Geeks

    8 Ocak 2012