これはArrowに関する記事を書くという記事です

書きます.

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でほげほげという僕のポストは全て没です.

以上.