垂れ流す思考

思考を垂れ流しアウトプットを行うブログ

ふつうのHaskellプログラミング 第5章

ふつうのHaskellプログラミング

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

噂のすごいH本を読んで楽しくHaskellを学んでいこうというコンセプト

会社のHaskellerさんに
「関数型素人がすごいH本で入門すると中盤で詰むよ」
「初めてならふつうのH本からがおすすめ」
ということなので『ふつうのHaskellプログラミング』からやっていこうかと。

第5章 遅延評価

ここからHaskellの全貌と言うことで第二部になる。
小難しくなりそうだが気合いを入れる。

評価(evaluation)

評価(evaluation)はプログラミングの世界では「計算」と同義。

Haskellの評価過程は置き換えモデル(substitution model)を使って表現できる。
仮引数を実引数に置き換えながら関数の適用を書き換えること。
仮引数と実引数の説明はここ


簡約(reduction)

square n = n * n

上記の関数をsquare (1 + 3)で評価する場合は、

square (1 + 3)
→ (1 + 3) * (1 + 3)
→ 4 * 4
→ 16

と言う流れ。
この作業を簡約(reduction)と言う。


最内簡約と最外簡約

square (1 + 3)(1 + 3) * (1 + 3)と簡約されるのが最外簡約
square (1 + 3)square 4と簡約されるのが最内簡約

最内簡約はJavaなどの言語。引数から簡約していく。
遅延評価のHaskellは最外簡約である。


グラフ簡約

ここは少しわかりずらいが、Haskellの遅延評価の特徴のもう片方。
(1 + 3) * (1 + 3)の足し算の部分の計算は一度しか行われないってこと。
しっかり書くと引数の評価は一度だけ評価される。
細かいけど忘れずに。


評価に必要ない式なんかは評価されない。
データ構造も必要な部分だけ評価される。
length [(1+1), (2+2), (3+3)]とあった場合、
(1+1) (2+2) (3+3)これらはlength関数の評価には必要ないので評価されません。効率的だね。


遅延評価の利点と欠点

上記三つが利点。

  • 思った順番で操作を実行するのが難しい
  • デバッグしにくい

これが欠点。

一長一短だけどそう言うもん。

デバッグに関しては使っていけばそこまで気にならなくなる?みたいな?


ここまで来たがコード書く量が減って来たな。もうちょっと手を動かさなきゃね。
今日はここまで。

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門