基本の基本〜私のためのHaskell〜総集編

  • まとめるには、もう少し時間がかかる。。。
  • Haskellの基本の基本のき
    • 原子のような要素とそれを関数で組み合わせたものとをひと塊として捉えている
      • 型は整数型のような要素的なものもあり、それを足し算と掛け算のルールで複雑にしたものも型とする。代数的型と言う。代数式で表される点が「関数」である。その定義自体が「関数」である
      • 型クラスも、単独の型を原子的要素とし、複数の型の集合に型クラスという共通名をつけ、さらに型クラスを統合して、新たな型クラスを作れるが、「単独の型」を「単独な型クラス」と見れば、この構成の仕方は、型の仕組みと同じ。この構成をするときも「関数」で定義する
    • 共通点でまとめよう、という意識がある
      • 複数の型に同じ名前の関数を適用したい、しかも複数の関数をセットで適用したい。これをする仕組みが型クラス。「集合」として考えているし、その集合・亜集合が「関数」で定義されている。集合・べき集合
      • 型を代数的に作るにあたり、代数式の要素を「変数」扱いすることで、代数式自体に呼び名をつける。そうすることで、同じ代数式で定義されつつ、代数式の要素変数(これも型)が異なるような型がまとめられる。ここも「関数」によるとりまとめである
    • 原子的要素もその代数式表現もどちらも型であったことからわかるように、「式表現されたもの(いわゆる関数)」自体が、関数の項になれる。高階関数
    • 入れ子
  • Haskellの基本の基本
    • Haskellのプログラムは型のつながりで表されていると言う意味で、型をノードとしたグラフである
    • Haskellのプログラムのノードは分岐のない部分グラフに余すところなく分けられる
    • 余すところ無く分けられたサブグラフを関数と呼ぶ(したがって、関数自身は、型の連なりという情報を持つ)
    • プログラムは関数がつながったものである。型が合う限り、関数合成できる。モナドの場合は、同じモナド同士は、"(>>=)","(>>)"により連結できるので、「外箱」の合致の条件を満たすことで連結できる
    • 処理の内側だけをまとめたりする利便性を提供してくれるのがモナド(Haskellがの基本の基本のき、が可能にしてくれるモナド)
      • 連結を支えるのは、bind関数とreturnというモナドに共通の性質
      • 内部に状態を持てる、というのを使うのがIOモナド、Stateモナド(内部に状態をもつために、内部に「関数」を持たせている)
    • Haskellの型は、型の加算と乗算とで書き表すことで、どんどん増やせる
    • この加算・乗算で新しい型を作る仕組みをもって、「代数的型」と呼ばれる
    • 例を示しておく。
      • 積算(掛け算)型の新しい型
data Hoge = Hage Bool Int
      • 加算(足し算)型の新しい型
data Hige = HageB Bool | HageI Int
      • なお、Hage、HageB、HageIは、「こういう型を作りますよ」という宣言であって、どんな型の代数式の項に取るかを示しているのは、Bool,Int。