SORU
1 HAZİRAN 2012, Cuma


Ne'in Şablon Haskell?hakkında çok kötü

Şablon Haskell sık sık talihsiz bir kolaylık olarak Haskell topluluğu tarafından izlendi. Bu konuda gözlemlediğim tam olarak kelimelere dökmek, ama bu birkaç örnek ele alalım

İnsanlar Şablon Haskell ile çok güzel şeyler yapmak, çeşitli blog yazıları, sadece düzenli Haskell gibi muazzam demirbaş azalması mümkün olmazdı bu güzel sözdizimi sağlayan görmemiştim. Neden Şablon Haskell üzerine Aşağı bu şekilde bakılır? Bu istenmeyen ne yapar? Hangi şartlar altında Şablon Haskell kaçınılmalıdır. neden olsun?

CEVAP
1 HAZİRAN 2012, Cuma


Kaçınarak Şablon Haskell için bir nedeni, bir bütün olarak tür-güvenli, "Haskell ruhu." çok karşı geliyor, böylece değildir İşte bu bazı örnekler:

  • Senin üzerinde hiçbir kontrolü ne tür Haskell AST bir parça TH kod oluşturur, ötesinde bir yerde görünür; bir değeri türü Exp ama bilmiyorsun eğer bir ifadesi olduğunu ifade eder [Char] (a -> (forall b . b -> c)) ya da her neyse. TH eğer bir fonksiyonu sadece belli bir türe veya işlevi bildirimleri, ya da tek tek ifadeleri oluşturabilecek ifade olsaydı daha güvenilir olurdu veri-yapıcı-desen eşleme, vb.
  • Hazırlamıyorsun ifadeler oluşturabilirsiniz. Var olmayan serbest bir değişken foo başvuran bir ifade oluşturulur? Şans olsa, sadece o aslında kod jeneratör kullanarak, ve sadece belirli bir kod üretimi tetikleyen şartlar altında göreceksin. Birim test için, çok zor bir şey.

TH da düpedüz tehlikeli

  • Derleme-zaman çalışan kod rastgele füze fırlatma veya kredi kartını çalmak dahil* *4, yapabilirsiniz. Hiç İNCİ patlatır için arama indirmek her cabal paketi ile bakmak zorunda istemiyorum.
  • İNCİ erişim "modülü-özel" fonksiyonları ve tanımları, tamamen bazı durumlarda saklama kırma.

O halde bu fonksiyonları kütüphane geliştirici olarak kullanmak daha eğlenceli yapmak için bazı sorunlar vardır:

  • İNCİ kodu her zaman birleştirilebilir değil. Diyelim ki birisi yapar bir jeneratör için lensler, ve daha sık değil, bu jeneratör olacaktır yapılandırılmış şekilde tek denilmek suretiyle doğrudan doğruya "son kullanıcı" ve değil diğer TH kod tarafından örnek alarak bir liste türü için kurucular lensler oluşturmak için parametre olarak. Zor kullanıcı sadece generateLenses [''Foo, ''Bar] yazmak varken kodu listesi oluşturmak için.
  • Geliştiriciler bile yokbiliyorumbu kod oluşturulabilir. forM_ [''Foo, ''Bar] generateLens yazma biliyor muydun? Q üzerinde her zamanki tüm fonksiyonları kullanabilmeniz için sadece bir monad. Bazı insanlar bu bilmiyorum, ve bu nedenle, aynı işlevselliği ile temelde aynı fonksiyonları birden çok yüklenmiş versiyonunu oluşturmak, ve bu işlevler belirli kabartmak bir etkiye yol açar. Ayrıca, çoğu insan kendi yazma jeneratörü Q monad gittiklerinde bile gerek yok, olduğu gibi yazma bla :: IO Int; bla = return 3; size veren bir işlevi daha fazla "çevre" daha fazla ihtiyacı var ve istemcilerin işlevi için gerekli ortamı sağlamak gibi bir etkisi bu.

Son olarak, TH fonksiyonları son kullanıcı olarak kullanmak daha eğlenceli yapmak için bazı şeyler vardır:

  • Donukluk. TH fonksiyonu Q Dec yazın zaman üst düzey bir modül kesinlikle hiçbir şey elde edebilirsiniz, ve kesinlikle oluşturulur ne üzerinde hiçbir kontrole sahip.
  • Monolithism. Eğer bir veritabanı arayüzü oluşturan bir işlev bulursanız ne kadar İNCİ bir işlevi geliştirici izin vermedikçe oluşturur; kontrol edemezsinveJSON serileştirme bir arayüz, diyemezsin "Hayır, ben sadece veritabanı arabirimi sayesinde ister; kendi JSON benim arabirimi geri döneceğim"
  • Çalışma zamanı. TH kod nispeten çalıştırmak için uzun zaman alır. Kodu bir dosyaya derlenmiş her seferinde yeniden yorumlanır ve genellikle, paketleri bir sürü çalışan İNCİ kodu gerekli, o yüklenecek. Bu sefer oldukça derleme yavaşlar.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bryan Adams

    Bryan Adams

    30 Mart 2006
  • njhaley

    njhaley

    24 NİSAN 2006
  • TechnoBuffalo

    TechnoBuffal

    8 HAZİRAN 2007