かじりかけの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の中では気にしなくて良い)
- 基本的にはすべて関数であって、代数
- 集合と代数と圏論とをベースに設計されているので、手続き、特にループとかは忘れるのがよい。ひたすら、集合と代数と圏とで、対象を記載し、それをHakell文法に変換することを目指すのがよい
- Haskellの作り
- Haskellは、上記を実装している
- 具体的にそれをプログラムにするにあたっては、結構、いきあたりばったりな文法規則になっている
- いきあたりばったりな文法規則なので、その部分であまり抽象的に「かく、あるべき」的に取り組むのは不得策
- 関数の定義の仕方が、「3階層〜module, class, type」になっていることと
- 各階層で、作りたいものを作れること。ただし、作る方法は結構どろくさく、提供されている「とりあえずの方法」に合わせることを嫌がらないことが大事
- と、言うわけで
- 具体的なコーディングでは「こうやるものだ」と覚えること・合わせること。その上で、処理の本質的な美しさ・頑健さを尊重する。
- これがやりたい、ということなら、Haskellで作りましょう、ということらしい