自然変換の例
『関数プログラミング』の 8.4 に抽象型についての説明があったんだけど、抽象化関数 abstr がそのまま自然変換になってる。こっちには全射(surjective)の条件が必要だけど・・・。
ユーザ定義の (list α) 型と組み込みのリストとの対応関係とか。
抽象化関数の簡単な例は、8.3.2 節で調べた [α] と型 (list α) とのあいだの対応関係を表すものである。
abstr :: (list α) → [α] abstr Nil = [] abstr (Cons x xs) = x : abstr xs
チャーチ数と自然数とのあいだの対応関係とか。
abstr :: nat → num abstr Zero = 0 abstr (Succ x) = abstr x + 1
集合とリストとの対応関係とか。
abstr :: [α] → set α abstr [] = {} abstr (x : xs) = {x}∪abstr xs
あとは関手の例も。
集合 s に元 x を追加する演算
addset :: α → set α → set α addset x s = {x}∪sを考えよう。関数
insert :: α → [α] → [α]はこの演算をリストによって実現するものであり、これは
abstr (insert x xs) = addset x (abstr xs)で定められる。このような規定はしばしば可換図式(commuting diagram)と呼ばれる図式で示される。(snip). これは
abstr・(insert x) = (addset x)・abstrを要求していることを意味している。
set ――――――→ set ↑ addset x ↑ abstr | | abstr | insert x | list ――――――→ list
addset と insert が関手になってる。
……なってる・・・よね?
こうしてみるとなんか自然変換が自然なものに見えてきた不思議。