Arrow の first が満たすべき公理が式だけだとわかりにくいので図式にしてみる。
first と pure は図式の中では関手っぽさを出すため First と Pure のように先頭大文字にしてみた。
多相なものには気分によって型を補足した。
1.[拡張] first (pure f) = pure (f×id)
Hom(X,Y) で X から Y への射の集まりを表すと
(-)×id_D Hom(B,C) --------------> Hom(B×D,C×D) | | | Pure | Pure ↓ ↓ Hom(B,C) --------------> Hom(B×D,C×D) First_D
上辺は通常の関数の世界、下辺は Arrow の世界。
first (pure f) = pure (f×id) で f = id とすると
first (pure id) = pure (id×id)
pure id も pure (id×id) も idA なので
first が関手であるための条件の一つ
first idA = idA
が導かれる。
2.[関手] first (f >>> g) = first f >>> first g
図は略。
上記の first idA = idA とこの法則が成り立つので first は関手。
3.[交換] first f >>> pure (id×g) = pure (id×g) >>> first f
f B1 --------> B2 g C1 --------> C2
とすると
Pure (id_B1×g) B1×C1 -----------------> B2×C2 | | | First_C1 f | First_C2 f ↓ ↓ B2×C1 -----------------> B2×C2 Pure (id_B2×g)
4.[単位] first f >>> pure fst = pure fst >>> first f
Pure fst B×D -----------------> B | | | First_D f | f ↓ ↓ C×D -----------------> C Pure fst
5.[結合] first (first f) >>> pure assoc = pure assoc >>> first f
f A --------> B
とすると
Pure assoc (A×C)×D ---------------------> A×(C×D) | | | First_D (First_C f) | First_{C×D} f ↓ ↓ (B×C)×D ---------------------> B×(C×D) Pure assoc