遅延評価

5.1 遅延評価とは

パターンマッチと遅延評価について

なるほどぉ。
パターンマッチするためには評価しないとパターンマッチ出来ない。
だからパターンマッチするときに式が評価されるんですね。
これが必要なものだけ評価するの意味ですね。

参照透明性について

言葉自体は難しいですが、本書の説明はとても簡易で分かりやすいです。
なるほど、Haskellには(再)代入が出来ないことや、入出力が特殊な仕組みで実現されているので、
参照透明性が確保されているわけですね。


思ってみれば、数学でいうところの関数は参照透明ですね。
Haskellにアカデミックな香りを感じるのはこの辺りが要因なのかなぁ、なんて思ったりして。


入出力の特殊な仕組み(IOモナド)に関してはまだよく分かりませんが、
後の章で出てくるので、楽しみに待ってます。

tail2.hsについて

いつもならスルーしてるところですが、しっかり理解しながら読み進めたいので、正直に眺めて見ました。
なお、tail3.hsは、まだ勉強していないキーワード(「IO()」や「.」など)が出ていたので、やめときました。


まずはdropの動きから。ghciで試してみると一目瞭然。

Prelude> :i drop
drop :: Int -> [a] -> [a] 	-- Defined in GHC.List
Prelude> drop 3 [1,2,3,4,5]
[4,5]
Prelude> drop 0 [1,2,3,4,5]
[1,2,3,4,5]
Prelude> drop 3 []
[]


なるほど、第一引数で指定した数の項目を落として(drop)リストを返すんですね。
そして、diffList関数。ちょっとややこしい。

diffList :: [String] -> [String] -> [String]
diffList xs []         = xs
diffList [] ys         = ys
diffList (_:xs) (_:ys) = diffList xs ys


第一引数には元々の入力文字列にlines関数を適用した結果、第二引数には第一引数にdrop nを適用した結果が入ってる。
第一引数と第二引数で一つずつリストを短くしていき、
片方のリストが空リストになったら、もう一方のリストを返す動きです。
結果として、長い方のリストの長い分だけのリストを返す関数になります。
たとえば、

diffList [1,2,3,4,5] [1,2,3]
→[4,5]
diffList "Hello, " "Hello, World!""World!"


となります。
なるほど、ようやく理解出来ました。確かにtail2.hsは10行縛りのtailコマンドになっていますね。
そして、リストの全体を作らずして、tailコマンドを実現しています。
ちょっと難しかった。