遅延評価
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コマンドを実現しています。
ちょっと難しかった。