書きます.
Arrowについてなんか分かったので, いつか必ず書きます.
Arrowというのは決して読めないコードを書くためのものではありません.
それは, 計算の本質です.
関数型言語に触れた人ならば, 計算の本質はλ計算と言うかもしれません.
確かにλ計算は素晴らしい構造です.
しかし, それが全てではありません.
Arrow, これもまた, 計算の本質になりうるのです.
λ計算は, 変数, λ抽象, そして適用の, 3つが根本, というかミニマルセットです.
この3つによって例えばブーリアンを表現でき, 自然数を表現でき, そして再帰できるのです.
ではArrowのミニマルセットは何でしょうか.
Arrowは, タプルを構築できることを想定しています.
つまり, タプルの根本である, (,), fst, sndこの3つは少なくともArrowに必要です.
また, (>>>)と, その単位元idは欠かせません. これはArrowレベルではなく, Categoryレベルで重要なものです.
後, Arrowに関するコンビネータに関しては, (***)と(&&&)が必要です.
Arrowの元となった論文では(***)ではなくfirstが重要であると言いますが, 対称性が悪い気がするので(***)の方が好きです.
そして, λ計算でそうであるように, Arrowでもまた, appは非常に本質的な関数です.
最後に, 再帰を形成するのに必要なloop.
以上の
(,), fst, snd (>>>), id (***), (&&&) app, loop
このセットはとても重要な意味を持ちます.
それはつまり, 全ての計算がこれらによって表現できるという事です.
何が言いたいかというと, 変数も, λ抽象(これは, 変数とλ項からλ項を生成する手続きのことです)も, 何もいらないという事です.
(ミニマルセットだと言いましたが, ミニマルじゃない気がするので, そのところは突っ込まないでください. あとでちゃんと考えます. (***)はいらない気がします. (&&&)は本質的に重要なので必要であることは分かっています.)
上のセットから生成できるもの, それはまさに「計算」なのですが, それは計算のみならず, データでさえも表現できます.
λ計算において, 自然数をλ項によって表現できるように, Arrowにおいてもまた, 自然数を計算によって表現できるのです*1.
計算にλなんていらなかったんや!!!
そういうことではありません.
λ計算が一つの計算のモデルだとすれば, Arrowもまた一つの計算のモデルなのです.
これ以上の事はテストが終わった後にきちんと書きます. 今はテスト勉強が忙しいということになっています.
取り敢えず, Arrowスタイルだ! と言いながら, uncurryを使ってるコードは爆発してください.
という訳でControl.Arrowでほげほげという僕のポストは全て没です.
以上.