かじりかけのHaskell評

  • Haskellを覚えるときに、どういう位置づけにするか
  • Haskellは代数的にプログラミングするのが好きなのであって、個別の事例は「たまたま見たかったものを見ることにした」という位置づけ
  • Haskellでは次のような「もの」がある
    • 「階層」を表す用語
    • 「階層に帰属するラベル」
    • 「ラベル」の具体的要素
  • 「階層」には以下がある
    • module
    • class
    • type
  • 「階層」はそれぞれ作り方が決まっている
    • moduleはファイルに書く。書式が決まっている
    • classは宣言して規定する
    • typeは宣言して規定する
  • 「階層に帰属するラベル」:それを(も)インスタンスと呼ぶ。
    • module階層に帰属する具体的なmodule存在にはmodule名がある。module IDと呼ぶ
    • class階層に帰属する具体的なclass存在にはclass名がある。class IDと呼ぶ
    • type階層に帰属する具体的なtype存在にはtype名がある。type IDと呼ぶ
  • 処理はtype階層の具体的なtype存在が実行する
    • type階層の具体的なtype存在は小文字始まり
    • type階層の具体的なtype存在は、すべて関数
    • 単独でのtypeと、typeの流れを表す関数とは、本質的に同じ
    • 関数は基本的にはtypeの流れなので1直線
    • 流れを複雑にする「分岐」は関数の中で定義する
    • プログラム全体はポセットになり、分岐には関数(と関数内に書かれた分岐)がある
    • プログラム全体のポセット構造と、その上で処理されて値を変えるリテラルとは、分離可能
    • 分離可能にするのは、数学的には圏論・ファンクタの仕事。Haskell的にはモナドが実現する。モナドにそれができるのは、モナド同士がさらさらと結合できるから。単位元もある(が、それは恒等関数の存在を認めさえすれば、当然なので、Haskellの中では気にしなくて良い)
  • 基本的にはすべて関数であって、代数
    • 具体的なリテラル(数値、文字、文字列:代数でないもの)は、代数が持ちうる「さらに具体的な例」である
    • リテラルは、何かを実行しようとするときに「気にする」対象だが、Haskellが本当に気にするのは代数だけ
  • 集合と代数と圏論とをベースに設計されているので、手続き、特にループとかは忘れるのがよい。ひたすら、集合と代数と圏とで、対象を記載し、それをHakell文法に変換することを目指すのがよい
  • Haskellの作り
    • Haskellは、上記を実装している
    • 具体的にそれをプログラムにするにあたっては、結構、いきあたりばったりな文法規則になっている
    • いきあたりばったりな文法規則なので、その部分であまり抽象的に「かく、あるべき」的に取り組むのは不得策
    • 関数の定義の仕方が、「3階層〜module, class, type」になっていることと
    • 各階層で、作りたいものを作れること。ただし、作る方法は結構どろくさく、提供されている「とりあえずの方法」に合わせることを嫌がらないことが大事
  • と、言うわけで
    • 具体的なコーディングでは「こうやるものだ」と覚えること・合わせること。その上で、処理の本質的な美しさ・頑健さを尊重する。
    • これがやりたい、ということなら、Haskellで作りましょう、ということらしい