自分なりのHaskellと圏論

  • 以下の2つを書き直しているだけ
  • Haskell圏論
    • Haskellが圏である
      • Haskellを成り立たせているものを圏論の言葉で語ることができる
    • Haskellは圏を作ったり、扱ったりすることができる
      • Haskellが新たなデータ型を作ると、それはそのデータ型で閉じた圏を作ることに相当する
      • また、圏と圏とを対応付ける関手もある
  • Haskellが圏であることについて
    • Haskellは(純粋)関数型言語(Lとする)
    • 純粋関数型言語Lに対して、圏C(L)を考える
    • Lというものを成り立たせてあるものが、圏の構成要素に対応させる、という意味
      • 対応させられるかさせられないか、が問題となるが、「純粋関数型言語Lは対応させられる」(関数型ではない言語は対応させられない)
  • (純粋)関数型言語であるHaskellが圏として扱えるので、Haskellを成りたたせているもののすべてを、圏の構成要素に対応させてみる
  • まず、純粋関数型言語の条件を挙げ、Haskellがその条件をどのように満たしているかを見てみる
    • 純粋関数型言語
      • プリミティブなデータ型を持つ
      • 各データ型に定数がある
      • 関数があって、それは、型を型へとの操作である
      • 構成子があって、それは、新たな型を、既存の型と操作とを使って作り出すことができる
    • Haskell
      • プリミティブなデータ型を持つ。それはInt,Char,Doubleなど基本的なデータ型
      • 各型には、定数がある。
      • 関数は「型のある引数をもらって型のある返り値を返す」という型から型への操作である
      • 新たなデータ型を定義することができる
  • 次に、圏の構成要素とHaskellという純粋関数型言語の構成要素とを列挙し、その対応関係を確認する
    • 純粋関数型言語Lの圏C(L)の構成要素
      • C(L)は対象を持つ。Lの型をC(L)の対象とする
        • HaskellではIntやDoubleや(Int -> Int)など
      • C(L)は射を持つ。Lの操作(関数)をC(L)の射とする
        • C(L)の射はソースとターゲットを持つ。Lの操作(関数)はある型をある型へと結ぶ。ソースとターゲットはLの型であり、C(L)の対象である
      • C(L)の射は合成できる。射と合成してできる射には、ルールがある。Lの操作(関数)は合成できる。また、元の操作(関数)と合成してできる操作(関数)とにはルールがある
        • Haskellでは関数の結合を(.)がある
      • C(L)を考えるときには、恒等射が必要である。Lにも恒等関数がある
        • Haskellでは id :: a -> aが恒等関数
      • C(L)は圏と圏とを対応付ける関手を持つ。Lのデータ型(新たに作り出したデータ型のこと?、新たな型を含めてすべてのデータ型のこと?おそらく前者)で出来上がっているものも圏として扱えるが、このようにLが持つ2つの圏の対応付けができる
        • Haskellでは型構築子 data が新規に作る圏の対象(型)を作り、fmap関数が元からある圏の関数を新しい圏の関数として作る。従って型構築子とfmap関数とで、関手ができている
          • javaの継承みたいなこと??
    • モナドは?
      • モナドとは、ある圏から、その同じ圏への関手のことらしい
      • 出発点に着地しているので、同じ世界だけれども、違う対象の取り上げ方と、その対応付け方に変わってくるのだろう(か?)
      • それをやるときに、関手の作りにだけ注意すれば、新しい圏(実は同じ世界だが、ルールが違う)に新たなルールの体系を作る必要がない(なくて便利)ということなのか・・・