1. ホーム
  2. haskell

[解決済み] Real World Haskellのどの部分が今となっては時代遅れ、あるいはバッドプラクティスと考えられているのでしょうか?

2022-11-24 01:40:04

質問

の19章で リアルワールドハスケル の変更により、多くの例が失敗するようになりました。 Control.Exception .

そう考えると、この本に書かれていることのいくつかは、実はもう時代遅れで勉強する価値がないのかもしれませんね、何しろもう6年も経っているのですから。私の他の唯一の参考文献は を学ぶ Haskell For Great Good」です。 ですが、RWHに比べればずっと基礎的です。

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

編集部:2008年12月発行の版についてですが、今日(2017年11月)現在で判明しているのはこの版のみです。

どのように解決するのですか?

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です。モナドが変更されました。現在、議論が行われているのは を削除するための return から Monad というように Monad のインスタンスは現実世界と本当に同期していないことになります。

とはいえ、一般的なガイドラインとして有用な資料であることに変わりはありません。しかし、多くのライブラリがそのリリース以降に変更されたことを心に留めておいてください。

RWHを読みながら一緒に読むことができるものは Haskellを学ぶときに知っておきたかったこと" Stephen Diehl著 . これはさらなる洞察を与えてくれますが、いくつかのセクションは本当に新参者に優しくないので、注意してください。

一般的な注意事項

  • コメントを読んでください。それらは通常、与えられた段落/セクションがまだ適切であるかどうか、および/または、機能しているかどうかの情報を含んでいます。
  • 使いたいライブラリや関数のドキュメントを読みましょう。たとえ怠惰であっても、少なくとも型は知っておきましょう。

各章の備考

RWHを読んでいて気がついたことをざっとまとめてみました。おそらく不完全なものだと思います。

第2章 型と機能 対FTP

GHC 7.10 以降 .

の型は null は、これまで 変更 により 折りたたみ式トラバーサブル・プロポーザル . などの多くの機能があります。 foldr , foldl など、以前は [a] にのみ定義されていたものが Prelude は、より一般的な Foldable t => t a のバリアントに置き換えられました。

第11章 テストと品質保証

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

で言及されていますが 脚注 に記載されていますが、QuickCheck ライブラリはバージョン 1 とバージョン 2 で多くの点で変更されています。たとえば generate を使用するようになりました。 Gen a の代わりに StdGen の機能性はそのままに、従来の generateTest.QuickCheck.Gen.unGen .

疑問がある場合は ドキュメント .

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

コードを壊す Applicative m => Monad m

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

GHC 7.10では Applicative のスーパークラスとなります。 Monad のスーパークラスとなり、多くのユーザコードを破壊する可能性があります。この移行を容易にするために、GHCは現在、定義がApplicative-Monad提案と衝突したときに警告を生成します ( 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

この章は全体的には良いのですが、コメントや、この章にある ユーラス・シュモビッチ氏のブログ を読むと、以下のコードのファイナライザの部分は悪い習慣であることがわかります。

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() , newdelete , allocatedeallocate のように、常に正しい関数を使用する必要があります。

<ブロッククオート

TL;DR メモリの解放は、常にメモリを割り当てたのと同じアロケータを使用すべきです。

外部関数がメモリを割り当てた場合、付随するデアロケーション関数も使用する必要があります。

第19章. エラー処理

エラー処理は6.8から6.10で完全に変更されましたが、すでにお気づきでしょう。より良い読み物は ドキュメント .

第22章. 拡張された例 ウェブクライアントプログラミング

例の一部が壊れているようです。また、他のHTTPライブラリもあります。

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

一般的なプロファイリング技術は相変わらずで、例(下記参照)はプログラムで起こりうる問題のケーススタディとして最適です。しかし、RWH には、たとえば ThreadScope によるマルチスレッド プロファイリングがありません。また、遅延IOは、私が知る限り、この本全体を通して懸念されていません。

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

第24章・第28章 (並列プログラミング・STM)

一方 第24章 並列・マルチコアプログラミング 第28章 ソフトウェア・トランザクション・メモリ はまだ関連性があり、Simon Marlowの著書 Haskellによる並列・並行プログラミング は、並行プログラミングと並列プログラミングにのみ焦点を当てており、かなり最近のものです(2013年)。GPUプログラミングとリパは、RWHでは完全に欠落しています。

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

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

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

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

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

GHC 6.8は、Haskell Platformが導入される前の最後のバージョンです。 そのため、付録ではGHCとCabalを手作業で取得するように書かれています。 やめてください。 代わりに、haskell.org の説明に従ってください。 ダウンロードページ .

また、付録では、Cabal のサンドボックスについて教えてくれませんが、これは Cabal 1.18 で導入され、依存性地獄からあなたを解放する . そしてもちろん stack は完全に欠落しています。

欠落しているコンテンツ

RWHで全く議論されていないトピックがあります。これには、以下のようなストリーミング・ライブラリが含まれます。 パイプ 導管 であり、さらに レンズ .

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

Control.Applicative

RWHの用途 Control.Applicative 's (<$>) を説明することはできませんが、いくつかの点で Control.Applicative を全く説明していない。 LYAH と、その タイペークラッシックペディア には Applicative . ということは Applicative のスーパークラスであることを考えると Monad (というクラスがあるので、それを暗記することをお勧めします。

さらに、いくつかの演算子は Control.Applicative (そして型クラス自体も) が Prelude の一部となったので、演算子が <$> , <*> などがあります。

レンズ

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

ツール

  • バージョン1.18のCabalで導入された サンドボックス
  • stack Haskell プロジェクトを開発するためのクロスプラットフォームプログラムです。
  • ghc-mod vim、emacs、Sublime Text などのエディタ用のバックエンド

新規/欠落している言語拡張と GHC の変更点

  • 実行時型多相性 ( :i ($) は大きく変わりました)
  • -XTypeInType
  • -XDataKinds
  • -XGADT
  • -XRankNTypes
  • -XGenericNewtypeDeriving
  • -XDeriveFunctor
  • 6.6 以降に発生したその他の拡張機能