今日は法則に関して色々やった。何故法則なんているんだろうか?
法則は重要だから法則は重要である、はトートロジーだけども、 1かけらの真実も含まれている。例えば、ある土地の中ではある特定の側を車が走ることを規定した道路交通法のように、全員が従えばそれだけで便利な法則もある。
Cats や Haskell スタイルの関数型プログラミングが可能とするのは、
データ、コンテナ、実行モデルなどを抽象化させたコードを書くことだ。
この抽象化は法則で言明されたことのみを前提とするため、
抽象的なコードが正しく動作するためには全ての A: Monoid
が法則を満たしている必要がある。
これを実利主義的視点と呼べる。
何らかの実利があることを受け入れたとしても、何故これら特定の法則なのかは気になる。
HaskellWiki や SPJ論文の一つに書いてあるからに決まってる。
これらを既存の実装付きの取っ掛かりとして、真似をすることができる。
これは伝統主義的視点と呼べる。
ただ、これは Hakell 特有の設計方針や制限まで受け継いでしまう危険をはらんでいる。
例えば、圏論における函手 (functor) は Functor[F]
よりも広い意味を持つ用語だ。fmap
は F[A] => F[B]
を返す関数なので関連性がある。
Scala の map
まで来ると、型推論のせいでその関係すら消えてしまう。
最終的には、僕たちの理解を数学までつなげるべきだ。 Monoid則はモノイドの数学的な定義に対応し、そこから既知のモノイドの特性の恩恵を得ることができる。 特にこれは Monoid則に関連することで、3つの法則は圏の3公理と同じもので、それはモノイドは圏の特殊形であることに由来する。
習う過程では、カーゴ・カルトから始めるのも悪くないと思う。 模倣とパターン認識を通して僕達は言語を習得してきたはずだ。