web-dev-qa-db-ja.com

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

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

それで、この本の中のいくつかは実際には時代遅れで、もう勉強する価値がないと思うかもしれません。私の唯一の他の参照はLearn Good a Haskell For Great Goodです。これは素晴らしい本ですが、RWHと比較してはるかに基本的なものです。

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

編集:これは、2008年12月に発行された本の版に関するもので、今日(2017年11月)で唯一の既知の版です

104
swang

RWHの主な問題

古い。RWHはGHCのバージョン6.8が使用されていたときに書かれた。 6.8 ベースバージョン3.0.x.xを使用。 6.10.1はすでに4.0.0.0を使用しており、これにより 多くの変更 が導入されました。そして、それは6.8から6.10へのジャンプです。 GHCの現在のバージョンは7.10です。モナドが変更されました。現在、議論があります returnMonadから削除するため です。そのため、Real World HaskellのMonadインスタンスは実際の世界とは同期していません。

そうは言っても、それは一般的なガイドラインのための有用なリソースです。ただし、多くのライブラリはリリース後に変更されていることに注意してください。

RWHを読みながら読むことができるものは、 "Haskellを学ぶときに知っていたいこと" by Stephen Diehl です。それはさらなる洞察を提供しますが、いくつかのセクションは実際には新人フレンドリーではないことに注意してください。

総論

  • コメントを読んでください。通常、それらには、与えられた段落/セクションがまだ関連性があり、機能しているかどうかの情報が含まれています。
  • 使用するライブラリ/関数のドキュメントを読んでください。怠け者でも、少なくともタイプを知ってください。

章へのコメント

これは、RWHを読んでいるときに気づいたことのいくつかの簡単な概要です。おそらく不完全です。

第2章タイプと機能vs the FTP

GHC 7.10以降。

null のタイプは 変更可能Foldable-Traversable-Proposal のためです。 foldrfoldl、および以前にPreludeで_[a]_に対してのみ定義されていた他の多くの関数は、より一般的な_Foldable t => t a_バリアントに置き換えられました。

第11章テストと品質保証

Haskell-platform 2010以降または2008年後半から。

これは footnote で言及されていますが、QuickCheckライブラリは多くの点でバージョン1からバージョン2に変更されています。たとえば、generateStdGenの代わりに_Gen a_を使用し、古いgenerateは_Test.QuickCheck.Gen.unGen_にあります。

疑わしい場合は、 ドキュメント を確認してください。

第14章モナド&第15章モナドを使ったプログラミング

コード分​​割:_Applicative m => Monad m_

GHC 7.10の時点で、Applicativeは、2007年には計画されていなかったMonadのスーパークラスになりました。

GHC 7.10では、ApplicativeMonadのスーパークラスになり、多くのユーザーコードを破壊する可能性があります。この移行を容易にするために、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経由。また、私が知っている限り、怠la IOは本全体で関係ありません。

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

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

第24章コンカレントおよびマルチコアプログラミング および 第28章ソフトウェアトランザクションメモリ は引き続き関連しますが、Simon Marlowの本 Haskellでの並列および同時プログラミング 並行プログラミングと並列プログラミングのみで、かなり最近(2013年)です。 GPUプログラミングとrepaは、RWHでは完全に欠落しています。

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

他の章と同様に、設計ライブラリの一般的なガイドラインはまだ十分に書かれており、関連性があります。ただし、STに関する変更(?)により、結果をコンパイルできなくなりました。

第27章ネットワークプログラミング

まだほとんどが最新です。結局のところ、ネットワークプログラミングはそれほど簡単には変更されません。ただし、このコードでは非推奨の関数bindSocketおよびsCloseを使用しています。これらはbindおよびcloseに置き換える必要があります(修飾インポートを使用することが望ましい)。非常に低レベルであることに留意してください。より専門的な高レベルのライブラリを使用することをお勧めします。

付録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_についてはまったく説明しません。 [〜#〜] lyah [〜#〜] および Typeclassopedia にはApplicativeのセクションが含まれます。 ApplicativeMonadのスーパークラスである場合(上記を参照)、そのクラスを暗記することをお勧めします。

さらに、_Control.Applicative_のいくつかの演算子(および型クラス自体)はPreludeの一部になっています。したがって、演算子が_<$>_、_<*>_などと衝突しないようにしてください。

レンズ

ストリーミングライブラリ

ツーリング

  • sandboxes を導入したCabalのバージョン1.18
  • stack 、Haskellプロジェクトを開発するためのクロスプラットフォームプログラム
  • _ghc-mod_ 、vim、emacs、Sublime Text、その他のエディターのバックエンド

新しい/不足している言語拡張とGHCの変更

  • 実行時の型の多型(:i ($)は大幅に変更されました)
  • _-XTypeInType_
  • _-XDataKinds_
  • _-XGADT_
  • _-XRankNTypes_
  • _-XGenericNewtypeDeriving_
  • _-XDeriveFunctor_
  • 6.6以降に発生したその他の拡張機能
133
Zeta