hayaのHaskell日記

2006-08-21

[] 4.1節 モジュール 10:26

特筆することもなく。

[] 4.2節 総合演習 10:26

ここだけ必要な何か

where節を使うと、ある関数の中だけで使える関数を定義できる。関数だけでなく、他にも使い道はあると思うけど。

[] 4.4節 練習問題 10:39

sort

import List

main = do cs <- getContents

putStrLn $ unlines $ sort $ lines cs

uniq

import List

main = do cs <- getContents

putStrLn $ uniq cs

uniq :: String -> String

uniq cs = unlines $ map head $ group $ lines cs

[] 5.1節 遅延評価 18:22

遅くたっていいじゃないか、Haskellだもの

Haskellは、遅延評価遅延評価は、計算を進めるためにどうしても値を知る必要があるときになって、やっと値を計算する。値を計算する前は、関数の定義に従って置き換えのみが行われる。このように、定義に従って置き換えていく方法で動作を説明するのが、置き換えモデル

Haskell遅延評価は、最外簡約(outermost reduction)とグラフ簡約(graph reduction)を組み合わせたものである。

限りなく透明なHaskell

Haskellは参照透明である。参照透明とは、同一スコープ内で、同じ表現があった場合に、全て同じ値に置き換えられるということ。いまいち名前と意味が頭の中でマッチしないが、Haskellをもっと知ればわかる日が来るのだろうか。

透明 → 純粋あのころ君は若かった → いつまでもそのままの君で → 参照透明な君で (・ω・)

[] 5.2節 遅延評価シミュレーション 18:55

実際にどのような順序で評価されるのかの例。

[] 5.3節 遅延評価のメリット・デメリット 18:55

メリットとデメリットは、表裏一体

メリット by ふつケル著者
デメリット by ふつケル著者
  • 思った順番で操作を実行するのが難しい
  • デバッグしにくい

無限リスト( ゜д゜)?

n以上の全ての数を含むリストを返すints関数

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)として放置される。まったく、Haskelllazyな奴である。

トラックバック - http://haskell.g.hatena.ne.jp/harg/20060821