このエントリはきっと嘘だらけだと思います
Haskell を使ってみて自分が感じたイメージを文章にしてみただけです。
Haskell の遅延評価について自分の脳内を整理
- Haskell は変数がない。
- 変数っぽくみえるシンボルは全部(?)関数だ。
- だから、副作用(IOとか)のない関数は外部の状態に結果が左右されることはない。
- 副作用(IOとか)のない関数は引数が同じなら実行する必要はない。(要素のキャッシュ)
例
a = 1 + 1 b = a + a c = b + b main = putStrLn $ show $ c
この結果は絶対 8 だ。しかし、その求めかたは手続き型とは大きく違う。
Haskell の考え方
- a も b も c も関数だ。
- c の値が必要
- c は b の値が必要
- b は a の値が必要
- a は 1 + 1 である
- b の最初の a を評価する。二個目以降の a の値は確実に 2 なのでこれ以上 a を評価しない。
- b は 2 + 2 である
- c の最初の b を評価する。二個目以降の a の値は確実に 4 なのでこれ以上 b の評価しない。
- c は 4 + 4 である
- c は 8 である
もっと言う
- 普通の言語だったら変数のように見える関数(つまり、「関数 = 値」の世界)
- 結果はメモ化された関数のように、メモリに保持されるしくみ(関数は外部からの干渉がないため、すべての関数の結果はメモできる。)
- Haskell の関数は、評価が一度しか行われない関数。
- 関数には、「基本的に」副作用がないため、値の評価のタイミングはいつでもいい。