海野秀之(うんのひでゆき)の外部記憶
Twitter (twilog) / RSS / アンテナ / ぶくま
すぐに読みたかったので、英語なのに Kindle 版を買ってしまって失敗したかなと思ったのですが、英語は平易で読みやすい。(英語の本は紙で読んだほうが頭に入りやすいことが多い気がしてたのですけど)
とりあえず読み始めなんで、 まだ並列プログラミングに入る前の遅延評価についてなんですが、評価のようすを GHCi 上で確かめていくのが結構面白い。
Prelude> let x = 1 + 2 :: Int Prelude> :sprint x x = _ Prelude> x 3 Prelude> :sprint x x = 3
GHCi 上で :sprint を使うと、変数の値を調べることができて、一回目の :sprint では "x = _" とあらわされています。この "_" は未評価 (thunk) を示しています。つぎに、x の値を表示させてから :sprint すると、x の内容が計算結果で置き換わっていることがわかります。
本では、この他にも、いくつかもう少し複雑な例が紹介されています。たとえば、
Prelude> let xs = map (+1) [1..10] :: [Int] Prelude> :sprint xs xs = _ Prelude> length xs 10 Prelude> :sprint xs xs = [_,_,_,_,_,_,_,_,_,_] Prelude> sum xs 65 Prelude> :sprint xs xs = [2,3,4,5,6,7,8,9,10,11]
こんな感じ。おもしろい。
ねよっと。つづきは The Eval Monad, rpar, and rseq から。