Yoneda functor
@Deprecated
替わりに(Co)Yoneda reduction for free - PSを参照。
Haskell(kan-extensions)のYoneda
functor*1:
module Data.Functor.Yoneda ... newtype Yoneda f a = Yoneda { runYoneda :: forall b. (a -> b) -> f b }
を攻略する試み。
Contravariant Yoneda embedding
まず、Yoneda embeddingのcontravariant版を定義する:
Covariant Yoneda lemma
Category Theory (Oxford Logic Guides) のYoneda lemmaにおいて
を使えば、そのcovariant版を作ることができる:
こちらをCovariant Yoneda lemma、Category Theory (Oxford Logic Guides) にあるのをContravariant Yoneda lemmaと勝手に呼ぶことにする*2。 Covariant版の方が、opposite categoryを作るのがめんどうな場合、都合がよさそうである。
Covariant Yoneda functor
Covariant Yoneda lemmaにより、
となるが、左側のfunctor
が
newtype Yoneda f a = Yoneda { runYoneda :: forall b. (a -> b) -> f b } instance Functor (Yoneda f) where fmap f m = Yoneda (\k -> runYoneda m (k . f))
だ、ということ。
Contravariant Yoneda functor
全く同様にして、contravariant版、つまり、Category Theory (Oxford Logic Guides) のYoneda lemmaに対応するものを作ることが出来る。
module Data.Functor.Contravariant.Yoneda ... newtype Yoneda f a = Yoneda { runYoneda :: forall r. (r -> a) -> f r } instance Contravariant (Yoneda f) where contramap ab (Yoneda m) = Yoneda (m . fmap ab)
Vs. Coyoneda functor
Isomorphism(bijection)の作り方は、Category Theory (Oxford Logic Guides) の証明そのままで
の右から左を作る(lift)のに、 、いわゆるfmap
の実装が必要になる。左から右を作る(lower)には必要がない。
一方、前回のCoyonda functorの場合は、状況が逆になる。