RWHの主な問題
古いです。RWHは、GHCのバージョン6.8が使用されたときに作成されました。6.8はベースバージョン3.0.xxを使用しました6.10.1はすでに4.0.0.0を使用しており、多くの変更が導入されました。そして、それは6.8から6.10へのジャンプです。GHCの現在のバージョンは7.10です。モナドが変更されました。議論は現在あります削除するreturn
からでMonad
て、Monad
実世界Haskellでは、インスタンスが本当に現実の世界と同期しなくなりますが。
そうは言っても、それはまだ一般的なガイドラインのための有用なリソースです。ただし、多くのライブラリはリリース後に変更されていることに注意してください。
RWHを読みながら読むことができるものは、Stephen Diehlによる「Haskellを学ぶときに知っておきたいこと」です。追加の洞察を提供しますが、一部のセクションは実際には新人にやさしいものではないことに注意してください。
総論
- コメントを読んでください。それらは通常、与えられたパラグラフ/セクションがまだ関連しているかどうか、および/または機能しているかどうかに関する情報を含んでいます。
- 使用したいライブラリ/関数のドキュメントを読んでください。怠惰な人でも、少なくとも型を知っておいてください。
章へのコメント
これは、RWHを読んでいるときに気付いたいくつかの概要です。おそらく不完全です。
第2章タイプと関数とFTP
GHC 7.10以降。
種類がnull
された変更に起因する折り畳み式-Traversableの-提案。などの他の多くの関数foldr
、foldl
および以前にでのみ定義されていた他の多くの関数[a]
は、Prelude
より一般的なFoldable t => t a
バリアントに。
Haskellプラットフォーム2010以降または2008年後半以降。
これは脚注で述べられていますが、QuickCheckライブラリはバージョン1からバージョン2に多くの点で変更されています。たとえば、の代わりにがgenerate
使用され、古い機能はにあります。Gen a
StdGen
generate
Test.QuickCheck.Gen.unGen
疑問がある場合は、ドキュメントを確認してください。
Chapter 14.モナド&Chapter 15.モナドを使ったプログラミング
コード違反: Applicative m => Monad m
GHC 7.10以降Applicative
、はのスーパークラスになりMonad
、2007年には計画されていませんでした。
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を介したマルチスレッドプロファイリングがありません。また、私が知る限り、レイジーIOは本全体を通して関係ありません。
mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)
第24章と第28章(並行および並列プログラミングとSTM)
一方で第24章並行マルチコアプログラミングおよび第28章ソフトウェアトランザクショナルメモリはまだ関連している、サイモン・マーローの本の並列並行プログラミングHaskellの中(2013)の同時並列プログラミングのみに焦点を当て、かなり最近のことです。GPUプログラミングとrepaはRWHには完全にありません。
他の章と同様に、デザインライブラリの一般的なガイドラインは、適切に記述され、関連しています。ただし、に関するいくつかの変更(?)ST
により、結果をコンパイルできなくなりました。
Chapter 27.ネットワークプログラミング
それはまだほとんどが最新です。結局のところ、ネットワークプログラミングはそれほど簡単には変更されません。しかし、コードの使用は、機能を非推奨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
ので、あなたの事業者はと衝突していないことを確認して<$>
、<*>
そして他の人。
レンズ
ストリーミングライブラリ
ツーリング
- サンドボックスを導入したCabalバージョン1.18
stack
、Haskellプロジェクトを開発するためのクロスプラットフォームプログラム
ghc-mod
、vim、emacs、Sublime Text、その他のエディターのバックエンド
新しい/不足している言語拡張とGHCの変更
- ランタイムタイプのポリモーフィズム(
:i ($)
大幅な変更)
-XTypeInType
-XDataKinds
-XGADT
-XRankNTypes
-XGenericNewtypeDeriving
-XDeriveFunctor
- 6.6以降に発生したその他の拡張機能