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 return
gelenMonad
böylece, Monad
Real 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 null
olmuş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]
Prelude
Foldable 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 a
yerine StdGen
ve eski işlevselliğini generate
iç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
/ Reader
Monads
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ü State
arkadaş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()
, new
ile delete
, allocate
birlikte 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 ST
artı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 bindSocket
ve sClose
değiştirilmesi gerektiğini, bind
ve 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 stack
tamamen 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 vectors
paketi 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 Applicative
bir ü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 Prelude
kadar 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