Real World Haskellのどの部分が廃止されたか、悪い習慣と見なされていますか?


107

Real World Haskellの 19章では、の変更により、多くの例が失敗しControl.Exceptionます。

そのため、この本の内容の一部は実際には時代遅れであり、もう勉強する価値がないと思います。結局6年になります。私の唯一の他の参考文献はLearn You a Haskell For Great Goodですが、素晴らしい本ですが、RWHと比較するとはるかに基本的です。

この本を以前に読んだことのある人なら、関係のない部分についてアドバイスをいただけますか?特に、本の後半の章、たとえば、ソフトウェアトランザクションメモリ、並行プログラミング、ソケットプログラミングなど。

編集:これは、今日(2017年11月)で唯一知られているエディションである、2008年12月に発行された本のエディションに関するものです。


2
AFAIKのオンライン版Real World Haskellは随時更新されます。Haskell Wikibookでもっと便利なものを見つけたかもしれません。
Vektorweg 2014年

@VektorwegこれまでのWikibookでの作業のほとんどは、導入章(LYAHレベルとほぼ同じ範囲をカバーしていますが、テイクは異なります)で、より高度な理論と型システムのトピックでカバーされています。適用される問題については、RWHの後半の章で見られるように、swangが参照しているように、RWHは今のところより良い選択です。でも、ウィキ
ブックの

1
@Vektorweg:印刷版とオンライン版の間に大きな違いはありませんでした。また、オンライン版はまったく更新されていないようです。ブルームフィルターの章は長い間(少なくとも2009年)壊れていました。言われていること、ウィキブックス、そう:)
ゼータ

1
@Swang Note:Learn You a Haskellにも古いものが含まれていますMonadが、これはのサブクラスになっていApplicativeます。
jub0bs 2015

1
その本のに言及してください。一般に、製品について話すときは、常にバージョンプラットフォームOSエディションなどについて言及してください。
Nawaz

回答:


137

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の-提案。などの他の多くの関数foldrfoldlおよび以前にでのみ定義されていた他の多くの関数[a]は、Preludeより一般的なFoldable t => t aバリアントに。

第11章テストと品質保証

Haskellプラットフォーム2010以降または2008年後半以降。

これは脚注で述べられていますが、QuickCheckライブラリはバージョン1からバージョン2に多くの点で変更されています。たとえば、の代わりにがgenerate使用され、古い機能はにあります。Gen aStdGengenerateTest.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

したがって、それらはモナド変換子によって定義されます。

第17章Cとのインターフェース:FFI

全体的な章は問題ありませんが、コメントや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()newdeleteallocatedeallocate、人は常に正しい関数を使用する必要があります。

TL; DR割り当てられたのと同じアロケータで常にメモリを解放する必要があります。

外部関数がメモリを割り当てる場合は、付随する割り当て解除関数も使用する必要があります。

第19章エラー処理

エラー処理は6.8から6.10に完全に変更されましたが、すでに気づいています。ドキュメントをよく読んでください。

第22章拡張例:Webクライアントプログラミング

一部の例は壊れているようです。また、他にも利用可能なHTTPライブラリがあります。

第25章プロファイリングと最適化

一般的なプロファイリング手法は同じで、例(下記参照)はプログラムで発生する可能性のある問題の優れたケーススタディです。ただし、RWHには、たとえばThreadScopeを介したマルチスレッドプロファイリングがありません。また、私が知る限り、レイジーIOは本全体を通して関係ありません。

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

第24章と第28章(並行および並列プログラミングとSTM)

一方で第24章並行マルチコアプログラミングおよび第28章ソフトウェアトランザクショナルメモリはまだ関連している、サイモン・マーローの本の並列並行プログラミングHaskellの中(2013)の同時並列プログラミングのみに焦点を当て、かなり最近のことです。GPUプログラミングとrepaはRWHには完全にありません。

第26章高度なライブラリー設計:ブルームフィルターの作成

他の章と同様に、デザインライブラリの一般的なガイドラインは、適切に記述され、関連しています。ただし、に関するいくつかの変更(?)STにより、結果をコンパイルできなくなりました。

Chapter 27.ネットワークプログラミング

それはまだほとんどが最新です。結局のところ、ネットワークプログラミングはそれほど簡単には変更されません。しかし、コードの使用は、機能を非推奨bindSocketsClose、に置き換えられるべきであるbindclose(好ましくは、修飾されたインポートを介しての)。これは非常に低レベルであることを覚えておいてください。より専門的な高レベルのライブラリを使用することをお勧めします。

付録A. GHCおよびHaskellライブラリのインストール

GHC 6.8は、Haskellプラットフォームが導入される前の最後のバージョンでした。したがって、付録では、GHCとCabalを手動で取得するように指示しています。しないでください。代わりに、haskell.org ダウンロードページの指示に従ってください

また、付録では、Cabal 1.18で導入され、依存関係の地獄から解放されるCabalサンドボックスについては触れていません。そしてもちろん、stack完全に欠落しています。

コンテンツがありません

一部のトピックは、RWHでまったく議論されていません。これには、パイプコンジットなどのストリーミングライブラリ、およびレンズも含まれます。

それらのトピックについてはいくつかのリソースがありますが、ここに、それらが何であるかを理解するための紹介へのリンクがあります。また、ベクターを使用したい場合は、vectorsパッケージを使用してください。

Control.Applicative

RWHの用途Control.Applicative(<$>)いくつかの点ではなく、説明していないControl.Applicativeすべてで。LYAHTypeclassopediaには、に関するセクションがあり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以降に発生したその他の拡張機能

おかげで、これはまさに私が求めていたものです:)、stateモナドの問題を思い出してください。State値コンストラクターがなくなったので、読んでいるときに頭を悩ませました。
2014年

@swang:それはまだ完全には程遠いです。多分ブライアンかドンは変更された機能についてもっと知っています。どちらの方法でも、一般的なガイドラインはそのままです。
ゼータ

1
高レベルのネットワーキングの場合、私はnetwork-simpleを好みます
ラムダフェアリー

「トランスデューサー」、コルーチンとストリーミングライブラリのパイプ、コンジットの間には関係があります。
CMCDragonkai 2015

HDBCの使用は古いと見なされますか?
Janus Troelsen 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.