米田の補題について

先ずはHomo functorの定義:

h(-,C): Cop -> Set

さらに:

h(-): C -> (Cop -> Set)

functor h(-) は米田埋め込み(Yoneda embedding)という名があり、Yと表記される。
米田の補題(Yoneda lemma)は下記となる:

∀F ∈ (Cop -> Set) と ∀A ∈ C, ∃ fA,F: ( h(-,A) -> F ) -> F(A), fA,Fは全単射(bijection/fully faithful)である。更に、この全単射は下記の意味ではCとFの間でnaturalの性質を持つ:

gとμを与える:
g: A' -> A in C
μ: F ⇒ F' in (Cop -> Set), 下図のようにSet中で交換可能の意味を持つ:
                        fA,F
( h(-,A) -> F ) -----------> F(A)
         |                                |
(g, μ)|                                |μA'F(g) = F'(g)μA
       |                                |
     ↓                              ↓
( h(-,A') -> F' )----------> F'(A')
                        fA',F'

抽象過ぎて全く意味分からないのでHaskellマッピングできるかを試してみた。
まずは h(-,C) を定義する:

data Homo c cop = Homo c cop deriving( Eq, Show )

instance Functor (Homo c) where
  fmap f (Homo c cop) = Homo c (f cop)

この定義ではh(Cop, C)はmorphism:( C -> Cop )の意味合いを表現できないが、今回はこいつをmorphismとして使わないから、morphismであることをこころに留めればいいと思う。
次はF、今回は特殊ケースでFもhomo functorを使うから特にすることがない。
次はfA,F:

-- h(-,A) -> F -> F(A)
bijection :: Homo c cop -> Homo c' cop' -> Homo c' c
bijection (Homo x _) (Homo y _) = Homo y x

正直微妙だね。なぜなら上記の定義から「h(-,A) -> F」がnatural transfermationのことが分からない。
まあ実際はnatural transfermationだけどね(下記μの定義を参照)。
こんな風に:

bijection :: (Homo c -> Homo c') -> Homo c' c

書ければ一番いいのだが、残念な事でできない。
あとはgとμを適当に定義して結果を見るだけだ:

myu :: Homo c cop -> Homo (Homo c c) cop
myu (Homo x y) = Homo (Homo x x) y

main :: IO ()
main = print (bijection (Homo (g "A") "_") (myu (Homo "B" "_"))) >>   -- (1), 図の↓、→ルート
       print (myu . fg $ bijection (Homo "A" "_") (Homo "B" "_")) >>  -- (2), 図の→、↓ルート
       print (f'g . myu $ bijection (Homo "A" "_") (Homo "B" "_"))    -- (3), (1-3) must be equal
         where g = \x->x++"!"
               fg = fmap g
               f'g = fmap g

Output:

Homo (Homo "B" "B") "A!"
Homo (Homo "B" "B") "A!"
Homo (Homo "B" "B") "A!"

おお!素晴らしい!米田さんマジぱねぇっす!シビれるあこがれるゥ!
結論:米田の補題について理解したとは言えないが、少し具体的なイメージを捉えた。一応収穫ありってことね。