IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

Haskell メモ

このエントリはきっと嘘だらけだと思います

Haskell を使ってみて自分が感じたイメージを文章にしてみただけです。

Haskell の遅延評価について自分の脳内を整理

  • Haskell は変数がない。
  • 変数っぽくみえるシンボルは全部(?)関数だ。
  • だから、副作用(IOとか)のない関数は外部の状態に結果が左右されることはない。
  • 副作用(IOとか)のない関数は引数が同じなら実行する必要はない。(要素のキャッシュ)

a = 1 + 1
b = a + a
c = b + b
main = putStrLn $ show $ c

この結果は絶対 8 だ。しかし、その求めかたは手続き型とは大きく違う。

Haskell の考え方
  1. a も b も c も関数だ。
  2. c の値が必要
  3. c は b の値が必要
  4. b は a の値が必要
  5. a は 1 + 1 である
  6. b の最初の a を評価する。二個目以降の a の値は確実に 2 なのでこれ以上 a を評価しない。
  7. b は 2 + 2 である
  8. c の最初の b を評価する。二個目以降の a の値は確実に 4 なのでこれ以上 b の評価しない。
  9. c は 4 + 4 である
  10. c は 8 である

もっと言う

  • 普通の言語だったら変数のように見える関数(つまり、「関数 = 値」の世界)
  • 結果はメモ化された関数のように、メモリに保持されるしくみ(関数は外部からの干渉がないため、すべての関数の結果はメモできる。)
  • Haskell の関数は、評価が一度しか行われない関数。
  • 関数には、「基本的に」副作用がないため、値の評価のタイミングはいつでもいい。