У меня есть теоретический вопрос о характере типа, который используется в
много примеров, объясняющих лемму Койонеды. Их обычно называют
как "естественные преобразования", которые, насколько мне известно, сопоставляются между функторами.
Меня озадачивает то, что в этих примерах они иногда отображаются от Set
до некоторого функтора F
. Таким образом, на самом деле semm не является сопоставлением между функторами, а чем-то более расслабленным.
Вот код, о котором идет речь:
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
module Coyo where
import Data.Set (Set)
import qualified Data.Set as Set
data Coyoneda f a where
Coyoneda :: (b -> a) -> f b -> Coyoneda f a
instance Functor (Coyoneda f) where
fmap f (Coyoneda c fa) = Coyoneda (f . c) fa
set :: Set Int
set = Set.fromList [1,2,3,4]
lift :: f a -> Coyoneda f a
lift fa = Coyoneda id fa
lower :: Functor f => Coyoneda f a -> f a
lower (Coyoneda f fa) = fmap f fa
type NatT f g = forall a. f a -> g a
coyoset :: Coyoneda Set Int
coyoset = fmap (+1) (lift set)
applyNatT :: NatT f g -> Coyoneda f a -> Coyoneda g a
applyNatT n (Coyoneda f fa) = Coyoneda f (n fa)
-- Set.toList is used as a "natural transformation" here
-- while it conforms to the type signature of NatT, it
-- is not a mapping between functors `f` and `g` since
-- `Set` is not a functor.
run :: [Int]
run = lower (applyNatT Set.toList coyoset)
Что я не понимаю здесь?
EDIT: После обсуждения #haskell в freenode я думаю, что мне нужно немного разъяснить свой вопрос. Это в основном: "Что такое Set.toList
в
категориальный смысл? Поскольку, очевидно, (?) Не является естественным преобразованием ".