Real World Haskellの第19章では、Control.Exception
の変更により多くの例が失敗するようになりました。
それで、この本の中のいくつかは実際には時代遅れで、もう勉強する価値がないと思うかもしれません。私の唯一の他の参照はLearn Good a Haskell For Great Goodです。これは素晴らしい本ですが、RWHと比較してはるかに基本的なものです。
以前にこの本を読んだことがある人は、その本のどの部分がもはや関係ないかについてアドバイスをお願いできますか?特に、本の後半の章、たとえば、ソフトウェアトランザクションメモリ、同時プログラミング、ソケットプログラミングなど。
編集:これは、2008年12月に発行された本の版に関するもので、今日(2017年11月)で唯一の既知の版です
古い。RWHはGHCのバージョン6.8が使用されていたときに書かれた。 6.8 ベースバージョン3.0.x.xを使用。 6.10.1はすでに4.0.0.0を使用しており、これにより 多くの変更 が導入されました。そして、それは6.8から6.10へのジャンプです。 GHCの現在のバージョンは7.10です。モナドが変更されました。現在、議論があります return
をMonad
から削除するため です。そのため、Real World HaskellのMonad
インスタンスは実際の世界とは同期していません。
そうは言っても、それは一般的なガイドラインのための有用なリソースです。ただし、多くのライブラリはリリース後に変更されていることに注意してください。
RWHを読みながら読むことができるものは、 "Haskellを学ぶときに知っていたいこと" by Stephen Diehl です。それはさらなる洞察を提供しますが、いくつかのセクションは実際には新人フレンドリーではないことに注意してください。
これは、RWHを読んでいるときに気づいたことのいくつかの簡単な概要です。おそらく不完全です。
GHC 7.10以降。
null
のタイプは 変更可能Foldable-Traversable-Proposal のためです。 foldr
、foldl
、および以前にPrelude
で_[a]
_に対してのみ定義されていた他の多くの関数は、より一般的な_Foldable t => t a
_バリアントに置き換えられました。
Haskell-platform 2010以降または2008年後半から。
これは footnote で言及されていますが、QuickCheckライブラリは多くの点でバージョン1からバージョン2に変更されています。たとえば、generate
はStdGen
の代わりに_Gen a
_を使用し、古いgenerate
は_Test.QuickCheck.Gen.unGen
_にあります。
疑わしい場合は、 ドキュメント を確認してください。
Applicative m => Monad m
_GHC 7.10の時点で、Applicative
は、2007年には計画されていなかったMonad
のスーパークラスになりました。
GHC 7.10では、
Applicative
はMonad
のスーパークラスになり、多くのユーザーコードを破壊する可能性があります。この移行を容易にするために、GHCは、定義がApplicative-Monad Proposal( [〜#〜] amp [〜#〜] )と競合する場合に警告を生成するようになりました。
7.8.1リリースノート を参照してください。
State
/Writer
/Reader
モナド実際の状態のモナドは立ち上がりますか? セクションで、著者は主張します
Monad
インスタンスを定義するには、適切な型コンストラクターと_(>>=)
_およびreturn
の定義を提供する必要があります。これは、State
の実際の定義につながります。_-- file: ch14/State.hs newtype State s a = State runState :: s -> (a, s) }
_
State
とその友達は現在、
_type State s = StateT s Identity
type Writer w = WriterT w Identity
type Reader r = ReaderT r Identity
_
したがって、それらはモナド変換子によって定義されます。
全体的な章は問題ありませんが、コメントまたは Yuras Shumovichのブログ で読むことができるように、次のコードのファイナライザー部分は悪い習慣です。
_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))
_
malloc()
はfree()
、new
とdelete
、allocate
とdeallocate
で使用する必要があるため、常に正しい関数を使用する必要があります。
TL; DRあなたに割り当てたのと同じアロケータで常にメモリを解放する必要があります。
外部関数がメモリを割り当てる場合、付随する割り当て解除関数も使用する必要があります。
エラー処理は6.8から6.10に完全に変更されましたが、すでに気付いています。 ドキュメント をよく読んでください。
いくつかの例は壊れているようです。また、他のHTTPライブラリも利用できます。
一般的なプロファイリング手法は同じです。この例(下記参照)は、プログラムで発生する可能性のある問題の優れたケーススタディです。しかし、RWHにはマルチスレッドプロファイリングがありません。 ThreadScope経由。また、私が知っている限り、怠la IOは本全体で関係ありません。
_mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)
_
第24章コンカレントおよびマルチコアプログラミング および 第28章ソフトウェアトランザクションメモリ は引き続き関連しますが、Simon Marlowの本 Haskellでの並列および同時プログラミング 並行プログラミングと並列プログラミングのみで、かなり最近(2013年)です。 GPUプログラミングとrepaは、RWHでは完全に欠落しています。
他の章と同様に、設計ライブラリの一般的なガイドラインはまだ十分に書かれており、関連性があります。ただし、ST
に関する変更(?)により、結果をコンパイルできなくなりました。
まだほとんどが最新です。結局のところ、ネットワークプログラミングはそれほど簡単には変更されません。ただし、このコードでは非推奨の関数bindSocket
およびsClose
を使用しています。これらはbind
およびclose
に置き換える必要があります(修飾インポートを使用することが望ましい)。非常に低レベルであることに留意してください。より専門的な高レベルのライブラリを使用することをお勧めします。
GHC 6.8は、Haskellプラットフォームが導入される前の最後のバージョンでした。したがって、付録では、GHCとCabalを手で取得するように指示しています。しないでください。代わりに、haskell.org ダウンロードページ の指示に従ってください。
また、この付録では Cabal 1.18で依存性地獄から解放されます で紹介されたCabalサンドボックスについては説明していません。そしてもちろん、stack
は完全に欠落しています。
一部のトピックはRWHでまったく説明されていません。これには、 パイプ や コンジット などのストリーミングライブラリ、および レンズ も含まれます。
それらのトピックにはいくつかのリソースがありますが、ここでは、それらの概要を理解するための紹介へのリンクがいくつかあります。また、ベクトルを使用する場合は、 vectors
パッケージを使用します。
Control.Applicative
_RWHは、いくつかの点で_Control.Applicative
_の_(<$>)
_を使用しますが、_Control.Applicative
_についてはまったく説明しません。 [〜#〜] lyah [〜#〜] および Typeclassopedia にはApplicative
のセクションが含まれます。 Applicative
がMonad
のスーパークラスである場合(上記を参照)、そのクラスを暗記することをお勧めします。
さらに、_Control.Applicative
_のいくつかの演算子(および型クラス自体)はPrelude
の一部になっています。したがって、演算子が_<$>
_、_<*>
_などと衝突しないようにしてください。
conduit
の著者)pipes
の作成者、pipes
パッケージに含まれています)stack
、Haskellプロジェクトを開発するためのクロスプラットフォームプログラムghc-mod
_ 、vim、emacs、Sublime Text、その他のエディターのバックエンド:i ($)
は大幅に変更されました)-XTypeInType
_-XDataKinds
_-XGADT
_-XRankNTypes
_-XGenericNewtypeDeriving
_-XDeriveFunctor
_