[解決済み] Real World Haskellのどの部分が今となっては時代遅れ、あるいはバッドプラクティスと考えられているのでしょうか?
質問
の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
の機能性はそのままに、従来の
generate
は
Test.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()
,
new
と
delete
,
allocate
と
deallocate
のように、常に正しい関数を使用する必要があります。
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章 ネットワークプログラミング
まだほとんど最新版です。結局のところ、ネットワークプログラミングはそう簡単に変わるものではありません。しかし、このコードでは非推奨の関数
bindSocket
と
sClose
で置き換える必要があります。
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
の一部となったので、演算子が
<$>
,
<*>
などがあります。
レンズ
-
Edward Kmett氏によるビデオ
(作者
lens
) - Adam Gundry 氏による動画 "「Lenses: Compositional Data Access and Manipulation"
- Jakub Arnold氏による紹介とチュートリアル
ストリーミング・ライブラリ
-
Conduit の概要 by Michael Snoyman
(の作者
conduit
) -
Gabriel Gonzales によるパイプのチュートリアル
(作者
pipes
に含まれているpipes
パッケージ)
ツール
- バージョン1.18のCabalで導入された サンドボックス
-
stack
Haskell プロジェクトを開発するためのクロスプラットフォームプログラムです。 -
ghc-mod
vim、emacs、Sublime Text などのエディタ用のバックエンド
新規/欠落している言語拡張と GHC の変更点
-
実行時型多相性 (
:i ($)
は大きく変わりました) -
-XTypeInType
-
-XDataKinds
-
-XGADT
-
-XRankNTypes
-
-XGenericNewtypeDeriving
-
-XDeriveFunctor
- 6.6 以降に発生したその他の拡張機能
関連
-
[解決済み】Haskellでの挿入ソート
-
[解決済み] なぜHaskellでは整数の割り算ができないのか?
-
[解決済み] Haskellで "length "関数を使用しない場合のリストの長さ
-
[解決済み] Haskellは実世界で何に使われているのか?[クローズド]
-
[解決済み] IntとIntegerの違いは何ですか?
-
[解決済み] TLSサーバーを実装するためのHsOpenSSL APIの適切な使用法
-
[解決済み] Haskellの関数合成(.)と関数応用($)イディオム:正しい使い方
-
[解決済み] Haskell エラー 入力 `=' のパースエラー
-
[解決済み] HaskellのComonad型クラスとは何ですか?
-
[解決済み] Haskellの合成演算子(.)とF#のパイプ転送演算子(|>)の比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】なぜパースエラーになるのか?インデント?
-
[解決済み] 一般的に `{- |` で始まるHaskellのコメントは何を意味するのですか?
-
[解決済み] Haskellで "length "関数を使用しない場合のリストの長さ
-
[解決済み] Haskellは実世界で何に使われているのか?[クローズド]
-
[解決済み] IntとIntegerの違いは何ですか?
-
[解決済み] Haskellでメモ化?
-
[解決済み] Haskellの関数合成(.)と関数応用($)イディオム:正しい使い方
-
[解決済み] レコードの単一フィールドを割り当て、残りのフィールドはコピーするための省略記法?
-
[解決済み] Haskellの初心者向けガイド?[終了しました]
-
[解決済み] <*>は何と呼ばれ、何をするのですか?[クローズド]