ふつうのHaskellプログラミング 第5章
ふつうのHaskellプログラミング
ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門
- 作者: 青木峰郎,山下伸夫
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/10/05
- メディア: オンデマンド (ペーパーバック)
- この商品を含むブログを見る
噂のすごい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プログラミング ふつうのプログラマのための関数型言語入門
- 作者: 青木峰郎,山下伸夫
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/10/05
- メディア: オンデマンド (ペーパーバック)
- この商品を含むブログを見る