2006-08-21
■ [ふつケル] 4.4節 練習問題
sort
import List
main = do cs <- getContents
putStrLn $ unlines $ sort $ lines cs
uniq
import List
main = do cs <- getContents
putStrLn $ uniq cs
■ [ふつケル] 5.1節 遅延評価
遅くたっていいじゃないか、Haskellだもの
Haskellは、遅延評価。遅延評価は、計算を進めるためにどうしても値を知る必要があるときになって、やっと値を計算する。値を計算する前は、関数の定義に従って置き換えのみが行われる。このように、定義に従って置き換えていく方法で動作を説明するのが、置き換えモデル。
Haskellの遅延評価は、最外簡約(outermost reduction)とグラフ簡約(graph reduction)を組み合わせたものである。
限りなく透明なHaskell
Haskellは参照透明である。参照透明とは、同一スコープ内で、同じ表現があった場合に、全て同じ値に置き換えられるということ。いまいち名前と意味が頭の中でマッチしないが、Haskellをもっと知ればわかる日が来るのだろうか。
■ [ふつケル] 5.3節 遅延評価のメリット・デメリット
メリットとデメリットは、表裏一体
メリット by ふつケル著者
デメリット by ふつケル著者
- 思った順番で操作を実行するのが難しい
- デバッグしにくい
無限のリスト( ゜д゜)?
ints n = n : (ints (n+1))
最初はポカーンだったけど、よく考えれば遅延評価の最も基本的なことがわかってれば、このリストがHaskellで扱えることは理解できる。例えば
ints 10
の先頭の3つの要素が読み出される場合は
ints 10
↓
10 : (ints (10 + 1))
↓
10 : (ints 11)
↓
10 : 11 : (ints (11 + 1))
↓
10 : 11 : (ints 12)
↓
10 : 11 : 12 : (ints (12 + 1))
となって読み出した分の先の要素は、評価されないままints (12 + 1)として放置される。まったく、Haskellはlazyな奴である。