SORU
20 HAZİRAN 2010, Pazar


Büyük ölçekli tasarım Haskell?

/Yapı büyük işlevsel programlar, özellikle Haskell tasarım için iyi bir yolu nedir?

Yaşadım bir grup eğitimleri (Yaz Kendine bir Düzen olmak benim en sevdiğim, Gerçek Dünya Haskell bir yakın ikinci) - ama çoğu programlar nispeten küçük ve tek amaçlı. Ayrıca, özellikle de şık ve zarif bazıları (örneğin, WYAS büyük arama tabloları) olarak görmüyorum.

Ben şimdi isteyen yazma programları daha büyük, daha hareketli parçalar elde etme verileri çeşitli farklı kaynaklardan, temizleme, işleme, çeşitli biçimlerde, görüntüleme, kullanıcı arayüzleri, ısrar, iletişim ağları, vb. Nasıl en okunaklı, sürdürülebilir ve değişen şartlara adapte olmak için böyle bir kod yapısı olabilir mi?

Büyük bir edebiyat nesne yönelimli büyük şart programları için bu sorulara yanıt var. MVC, design patterns, gibi fikirler. endişeleri ayrılması ve OO bir tarzda yeniden kullanılabilirliği gibi geniş hedefleri gerçekleştirmek için iyi bir reçete. Ayrıca, daha yeni zorunlu dil 'büyümek' tarzı daha uygun. görünen için yeniden düzenleme gibi bir tasarım için kendilerini ödünç

Haskell için eşdeğer bir edebiyat var mı? Nasıl fonksiyonel programlama egzotik kontrol yapıları mevcut (monadlar, oklar, uygulamalı, vb.) Hayvanat Bahçesi en iyi bu amaç için istihdam? Ne en iyi uygulamaları tavsiye edebilir misiniz?

Teşekkürler!

EDİT (bu takip Etme Stewart'ın yanıt a):

@belirtildiği dons: "Monadlar türleri önemli mimari tasarımlar yakalayın."

Sorum şu ki: nasıl bir saf fonksiyonel bir dil önemli mimari tasarımları hakkında düşünmek gerekir?

Dereler ve birkaç işlem basamakları çeşitli veri harcanır. Veri yapıları kümesi için veri akışı için modüler ayrıştırıcıları yazabilirim, ve saf bir fonksiyonu olarak her bir işleme kısmına geçebilirim. İşlem adımları bir parça veri değerine bağlı olacaktır için gerekli ve diğerleri'. Bazı adımları GUI güncelleştirmeleri veya veritabanı sorgu gibi yan etkileri takip edilmelidir.

'Doğru' veri kravat ve güzel bir şekilde ayrıştırma adımları için yol nedir? Farklı veri türleri için doğru olanı yapar büyük bir işlev yazabilirsiniz. Ya da şimdiye kadar işlenmiş ne izlemek için bir monad kullanın ve her işlem adım monad devletten gelecek neye ihtiyacı varsa onu almak olabilir. Ya da bir büyük ölçüde ayrı programları yazma ve gönderme (bu seçeneği sevmiyorum) gönderebilir.

Kurşun İhtiyacımız olan bir Şey var o da bağlı slaytları: "eşleme tasarım Cümleler üzerine türleri/fonksiyonlar/sınıflar/monadlar". Bu cümleler nelerdir? :)

CEVAP
20 HAZİRAN 2010, Pazar


Büyük Design and Implementation of XMonad. Mühendislik Engineering Large Projects in Haskell ve bu konuda biraz karmaşayı yönetmek hakkında konuşuyorum. Karmaşayı yönetmek için Haskell birincil kod mekanizmaları yapılanma

Tür sistemi

  • Yazın sistem soyutlama, basitleştirme etkileşimleri uygulamak için kullanın.
  • Tipte anahtar değişmezler Uygula
    • (bazı değerler bazı kapsam kaçış) olamaz örneğin
    • Bazı kod no IO, disk dokunmaz
  • Zorunlu güvenlik: özel durumlar (Belki De/), kavramları karıştırma (Word,İnt,Adres) önlemek kontrol etti
  • İyi Veri Yapıları (fermuar gibi) hata statik sınırların dışında örneğin kural olarak test bazı sınıflar gereksiz hale getirebilir.

Profiler

  • Yığın ve zaman profilleri programlarınızı objektif bir kanıt sağlar.
  • Yığın profilleme, özellikle hiçbir uneccessary bellek kullanımını sağlamak için en iyi yoldur.

Saflık

  • Karmaşıklığı büyük ölçüde devlet kaldırarak azaltır. Kompozisyon çünkü tamamen işlevsel bir kod ölçeklendirir. Tüm ihtiyacınız biraz kod programın bir diğer kısmı değiştirdiğinizde gizemli bir şekilde kırmak olmaz -- nasıl kullanılacağını belirlemek için türüdür.
  • Kullanımı çok "model/görünüm/denetleyici" tarzı programlama: ayrıştırma dış veri en kısa sürede tamamen işlevsel veri yapıları üzerinde faaliyet gösteren bu yapılar, o zaman bir kez tüm iş bitti, render/flush/seri hale getirmek. Tutar kodunuzu saf en

Test

  • QuickCheck Kod Kapsamı, türleri ile kontrol edebilirsiniz. şeyleri test sağlamak için Haskell.
  • DZD RTS eğer çok fazla zaman GC yaparak geçirdiğini görmek için harika.
  • QuickCheck da modülleri için temiz, dik API belirlemek yardımcı olabilir. Eğer kodunuzu özelliklerini ifade etmek zor ise, muhtemelen çok karmaşık oluyorlar. Kodunuzu test özelliklerine temiz bir set kadar yeniden düzenleme tutmak, o kadar iyi oluştur. O kod muhtemelen iyi tasarlanmıştır.

Yapılanma için monadlar

  • Tip önemli mimari tasarımlar (bu kodu kere donanım, bu kod tek bir kullanıcı oturum, vb .) monadlar yakalama
  • E. g. X xmonad içinde monad, tam olarak ne aygıtları için görünür ne için tasarım yakalar.

Türü sınıflar ve varoluşsal tipler

  • Kullanım Türü sınıflar soyutlama sağlamak için: uygulamaları polimorfik arabirimleri arkasına saklan.

Eşzamanlılık ve paralleism

  • Kolay birleştirilebilir paralellik rekabeti yenmek için par programın içine gizlice.

Yeniden Düzenle

  • Haskell olarak yeniden Düzenlebir sürü. Bu tür büyük ölçekli değişiklikleri eğer akıllıca türleri kullanıyorsanız güvende olacak, emin olun. Bu kod tabanına ölçek yardımcı olacaktır. Senin refactorings tamamlanana kadar tip hatalara neden olur.

Akıllıca FFI kullanın

  • Bu FFI daha kolay yabancı kod ile oynamak için yapar, ama yabancı kod tehlikeli olabilir.
  • Veri iade şekli hakkında varsayımlar çok dikkatli olun.

Meta programlama

  • Şablon Haskell veya jenerik biraz klişe kaldırabilirsiniz.

Paketleme ve dağıtım

  • Cabal Kullanın. Kendi yapı sistemi roll yok.
  • İyi API docs için Haddock kullanın
  • graphmod gibi araçları modül yapıları gösterebilir.
  • Eğer kütüphaneler ve araçlar Haskell Platform sürümleri, Olası güveniyor. Sağlam bir zemine sahiptir.

Uyarılar

  • -Wall kodunuzu kokuyor temiz tutmak için kullanın. Ayrıca Agda, Isabelle bakın veya daha fazla güvence için yakalayabilirsiniz. Tüysüz gibi kontrol etmek için, büyük görmek iyileştirmeler önerecektir hlint,.

Tüm bu araçlar ile bir kolu karmaşıklığı, mümkün olduğunca bileşenleri arasında birçok etkileşim çıkarmadan devam edebilirsiniz. İdeal olarak, kompozisyon olduğu için çok kolay bakımı olan saf kod, çok büyük bir tabanı var. Her zaman mümkün değil, ama hedef değer.

Genel:ayrıştırmaken küçük referentially saydam bileşenlerine sistem mantıksal birimler Olası, onları modülleri onları uygulamak. Bileşenler, ayarlar (ya da içindeki bileşenler) için küresel veya yerel ortamlar monadlar eşleştirilmiş olabilir. Cebirsel veri türleri temel veri yapılarını tanımlamak için kullanın. Yaygın olarak bu tanımları paylaşımı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BuzzFeedVideo

    BuzzFeedVide

    10 AĞUSTOS 2011
  • JonnyEthco

    JonnyEthco

    5 EKİM 2006
  • Motor Trend Channel

    Motor Trend

    11 Mart 2006