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
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.
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.
Hata işleme tamamen 6.8'den 6.10'a değişti, ancak bunu zaten fark ettiniz. Belgeleri daha iyi okuyun .
Örnekten bazıları bozuk görünüyor. Ayrıca başka HTTP kitaplıkları da mevcuttur.
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.
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.
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
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