Coyoneda
code:haskell
data Coyoneda f b where
Coyoneda :: (a -> b) -> f a -> Coyoneda f b
-- fmap :: (a -> b) -> f a -> f b
-- とメッチャ似てない!?!?!?
データ構造そのものが fmap にメッチャ似てるので,どんな型 f :: Type -> Type を取ってきても,Coyoneda f :: Type -> Type は Functor のインスタンスになる.米田の補題やべえ.
ryota-ka.icon 自由 Functor や!!
code:haskell
instance Functor (Coyoneda f) where
fmap f (Coyoneda g x) = Coyoneda (f . g) x
Coyoneda の力によって,適当な f :: Type -> Type を持ってきたときに,無料で Functor のインスタンスを得ることができた.更に Free monad の力を借りると,適当な Functor のインスタンスを持ってきたときに,無料で Monad のインスタンスを得ることができる.やったぜ.(see also: Freer monad)