Real World Haskell'in hangi bölümleri artık modası geçmiş veya kötü uygulama olarak değerlendiriliyor?


107

Real World Haskell'in 19. bölümünde, birçok örnek artık değiştiği için başarısız oluyor Control.Exception.

Bu da bana, belki de bu kitaptaki bazı şeylerin aslında modası geçmiş ve artık çalışmaya değmediğini düşündürüyor, sonuçta 6 yıl oldu. Diğer tek referansım Learn You a Haskell For Great Good , harika bir kitap olmasına rağmen RWH'ye kıyasla çok daha basit.

Kitabı daha önce okumuş olan biri, lütfen kitabın hangi bölümlerinin artık geçerli olmadığı konusunda biraz tavsiye verebilir mi? Özellikle kitabın ikinci yarısındaki bölümler, örneğin yazılım işlem belleği, eşzamanlı programlama, soket programlama vb.

DÜZENLEME: Bu, bugün itibariyle bilinen tek baskısı olan Aralık 2008'de yayınlanan kitabın baskısı hakkındadır (Kasım 2017)


2
AFAIK, Real World Haskell'in çevrimiçi sürümü zaman zaman güncellenecektir. Belki Haskell Wikibook'ta daha yararlı şeyler bulursunuz .
Vektorweg

@Vektorweg Vikikitap'ta şimdiye kadarki çalışmaların çoğu, giriş bölümlerinde (farklı bir yaklaşımla kabaca LYAH seviyesiyle aynı zemini kapsayan) ve daha gelişmiş teori ve tip sistem konularının kapsamı içinde yapıldı. Uygulamalı konular için, RWH swang'ın atıfta bulunduğu sonraki bölümlerde görüldüğü gibi, RWH şimdilik daha iyi bir seçimdir; Yine de, bir Wikibook katılımcısı olarak, umarım eninde sonunda değişecektir :)
2014

1
@Vektorweg: Baskı ve çevrimiçi sürüm arasında önemli farklar görmedim. Ayrıca, çevrimiçi sürüm hiç güncellenmemiş gibi görünüyor, çiçeklenme filtresi bölümü uzun süredir (en azından 2009) bozuk. Bununla birlikte, Wikibooks, yay :).
Zeta

1
@Swang Learn You a Haskell'in bile eski şeyler içerdiğine dikkat edin, şimdi bu Monadbir alt sınıfı Applicative.
jub0bs

1
Lütfen kitabın baskısından bahsedin . Genel olarak, her zaman söz versiyonu , platformu , OS , edition Bir ürün hakkında konuşurken vb!
Nawaz

Yanıtlar:


137

RWH'nin ana sorunu

Bu eski. RWH, GHC'nin 6.8 sürümünün kullanıldığı bir zamanda yazılmıştır. 6.8, 3.0.xx temel sürümünü kullandı 6.10.1 zaten 4.0.0.0'ı kullandı ve bu da birçok değişikliğe neden oldu . Ve bu sadece 6.8'den 6.10'a sıçrama. GHC'nin güncel sürümü 7.10'dur. Monadlar değiştirildi. Bir tartışma şu anda var kaldırmak için returngelenMonad böylece, MonadReal World Haskell örneği gerçekten gerçek dünya ile senkronize olacak.

Bununla birlikte, genel kurallar için hala faydalı bir kaynaktır. Ancak yayınlandığı günden bu yana birçok kütüphanenin değiştiğini unutmayın.

RWH'yi okurken birlikte okuyabileceğiniz bir şey de Stephen Diehl'in yazdığı "Haskell'i Öğrenirken Keşke Bilseydim" . Ek bilgiler sağlar, ancak bazı bölümlerin gerçekten yeni başlayanlar için uygun olmadığını unutmayın.

Genel açıklamalar

  • Yorumları okuyun. Genellikle verilen paragrafın / bölümün hala geçerli olup olmadığı ve / veya çalışıp çalışmadığı hakkında bilgi içerirler.
  • Kullanmak istediğiniz kitaplıkların / işlevlerin belgelerini okuyun. Tembel olsanız bile, en azından türleri bilin.

Bölümlere açıklamalar

Bu, RWH'yi okurken fark ettiğim bazı şeylere hızlı bir bakış. Muhtemelen eksiktir.

Bölüm 2. Türler ve İşlevler - FTP

GHC 7.10'dan beri .

Tipi nullolmuştur değişti nedeniyle Katlanabilir-Traversable-Öneri . Ve daha önce yalnızca içinde için tanımlanan diğer birçok işlev foldr, daha genel değişkenlerle değiştirildi .foldl[a]PreludeFoldable t => t a

Bölüm 11. Test ve kalite güvencesi

Haskell-platform 2010'dan beri veya 2008'in sonlarından beri.

Bu bir söz edilmekte iken dipnot , QuickCheck kütüphane Örneğin sürümüne 2. sürüm 1'den birçok yönden değişti, generateşimdi kullandığı Gen ayerine StdGenve eski işlevselliğini generateiçindedir Test.QuickCheck.Gen.unGen.

Şüpheniz varsa, belgeleri kontrol edin .

Bölüm 14. Monadlar ve Bölüm 15. Monadlarla Programlama

Kod kırma: Applicative m => Monad m

GHC 7.10 itibariyle, 2007'de planlanmayan bir şeyin Applicativeüst sınıfı artık Monad.

GHC 7.10'da, potansiyel olarak birçok kullanıcı kodunu kıran bir Applicativeüst sınıf haline gelecektir Monad. Bu geçişi kolaylaştırmak için GHC artık tanımlar, Applicative-Monad Teklifi ( AMP ) ile çeliştiğinde uyarılar üretiyor .

7.8.1 sürüm notlarına bakın .

State/ Writer/ ReaderMonads

In Will gerçek devlet lütfen ayağa kalkar Monad? yazarlar, bölüm

Bir Monadörnek tanımlamak için, (>>=)ve için tanımların yanı sıra uygun bir tip oluşturucu sağlamalıyız return. Bu bizi gerçek tanımına götürür State.

-- file: ch14/State.hs
newtype State s a = State
    runState :: s -> (a, s)
}

Bu artık doğru değil çünkü Statearkadaşları artık

type State  s = StateT  s Identity
type Writer w = WriterT w Identity
type Reader r = ReaderT r Identity

Yani monad transformatörleri tarafından tanımlanıyorlar.

Bölüm 17. C ile Arayüz: FFI

Genel bölüm iyidir, ancak yorumlarda veya Yuras Shumovich'in blogunda okunabileceği gibi, aşağıdaki koddaki sonlandırıcı kısım kötü bir uygulamadır:

pcre_ptr <- c_pcre_compile pattern (combineOptions flags) errptr erroffset nullPtr
if pcre_ptr == nullPtr
    then do
        err <- peekCString =<< peek errptr
        return (Left err)
    else do
        reg <- newForeignPtr finalizerFree pcre_ptr -- release with free()
        return (Right (Regex reg str))

Gibi malloc()kullanılmalıdır free(), newile delete, allocatebirlikte deallocate, hep doğru işlevini kullanmalısınız.

TL; DR Belleği daima sizin için tahsis eden aynı ayırıcı ile boşaltmalısınız.

Yabancı bir işlev bellek ayırırsa, eşlik eden serbest bırakma işlevini de kullanmalısınız.

Bölüm 19. Hata işleme

Hata işleme tamamen 6.8'den 6.10'a değişti, ancak bunu zaten fark ettiniz. Belgeleri daha iyi okuyun .

Bölüm 22. Genişletilmiş Örnek: Web İstemcisi Programlama

Örnekten bazıları bozuk görünüyor. Ayrıca başka HTTP kitaplıkları da mevcuttur.

Bölüm 25. Profil oluşturma ve optimizasyon

Genel profilleme teknikleri hala aynıdır ve örnek (aşağıya bakınız), programınızda meydana gelebilecek problemler için harika bir vaka çalışmasıdır. Ancak RWH, örneğin ThreadScope aracılığıyla çok iş parçacıklı profilleme eksik. Ayrıca, bildiğim kadarıyla tembel IO tüm kitap boyunca ilgilenmiyor.

mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)

Bölüm 24 ve Bölüm 28 (Eşzamanlı ve paralel programlama ve STM)

İken Bölüm 24. Eşzamanlı ve çok çekirdekli programlama ve Bölüm 28. Yazılım işlem bellek hala alakalı Simon Marlow kitabı Haskell Paralel ve Eşzamanlı Programlama (2013) eşzamanlı ve paralel programlama sadece odaklanır ve oldukça yenidir. GPU programlama ve repa, RWH'de tamamen eksik.

Bölüm 26. Gelişmiş kütüphane tasarımı: Bloom filtresi oluşturma

Diğer bölümlerde olduğu gibi, tasarım kütüphanesinin genel kuralları hala iyi yazılmış ve konuyla ilgilidir. Ancak, ilgili bazı değişiklikler (?) Nedeniyle STartık sonuç derlenememektedir.

Bölüm 27. Ağ programlama

Hala çoğunlukla güncel. Sonuçta, ağ programlama o kadar kolay değişmiyor. Ancak, kod kaldırılmış işlevlerini kullanır bindSocketve sClosedeğiştirilmesi gerektiğini, bindve close(tercihen kalifiye alma yoluyla). Çok düşük seviyeli olduğunu aklınızda bulundurun, daha özelleştirilmiş yüksek seviyeli bir kitaplık kullanmak isteyebilirsiniz.

Ek A. GHC ve Haskell kitaplıklarını yükleme

GHC 6.8, Haskell Platformu tanıtılmadan önceki son sürümdü. Bu nedenle, ek size GHC ve Cabal'ı elle almanızı söyler. Yapma. Bunun yerine haskell.org indirme sayfasındaki talimatları izleyin .

Ayrıca, ek size Cabal 1.18'de sunulan ve sizi bağımlılık cehenneminden kurtaran Cabal sanal alanlarından bahsetmiyor . Ve tabii ki stacktamamen eksik.

Eksik içerik

Bazı konular RWH'de hiç tartışılmamaktadır. Bu, borular ve kanal gibi akış kitaplıklarını ve ayrıca lensleri içerir .

Bu konular için birkaç kaynak var, ancak burada bunların ne hakkında olduğuna dair bir fikir vermesi için bazı giriş bağlantıları var. Ayrıca, vektörleri kullanmak istiyorsanız vectorspaketi kullanın .

Control.Applicative

RWH birkaç noktada Control.Applicative's kullanır (<$>), ancak hiç açıklamaz Control.Applicative. LYAH ve Typeclassopedia ile ilgili bölümler içerir Applicative. Bunun Applicativebir üst sınıfı olduğu göz önüne alındığında Monad(yukarıya bakın), bu sınıfı ezbere öğrenmeniz önerilir.

Dahası, birçok işletmecileri Control.Applicative(ve typeclass kendisi) artık bir parçasıdır Preludekadar emin operatörlerinizin çatışma olmadığını olun <$>, <*>ve diğerleri.

Lensler

Akış kitaplıkları

Takımlama

  • korumalı alanları tanıtan Cabal'ın 1.18 sürümü
  • stackHaskell projeleri geliştirmek için bir çapraz platform programı
  • ghc-modvim, emacs, Sublime Text ve diğer editörler için bir arka uç

Yeni / eksik dil uzantıları ve GHC değişiklikleri

  • çalışma zamanı türü polimorfizmi ( :i ($)büyük ölçüde değişti)
  • -XTypeInType
  • -XDataKinds
  • -XGADT
  • -XRankNTypes
  • -XGenericNewtypeDeriving
  • -XDeriveFunctor
  • 6.6'dan sonra gerçekleşen diğer uzantılar

teşekkürler, tam da peşinde olduğum şey buydu :), bana devlet monad meselesini hatırlatıyorsun, artık bir devlet değeri kurucusu yok, okuduğumda anlamam için kafamı kaşıdı.
swang

@swang: Hala tamamlanmadı. Belki Bryan veya Don değişen özellikler hakkında daha fazla şey biliyordur. Her iki durumda da, genel kurallar hala geçerlidir.
Zeta

1
Üst düzey ağ iletişimi için, ağ basitliğini tercih ederim .
Lambda Fairy

"Dönüştürücüler", eş diziler ve akışlı kitaplık boruları, kanallar arasında bir ilişki vardır.
CMCDragonkai

HDBC kullanımının eski olduğu kabul ediliyor mu?
Janus Troelsen
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.