圏論では、モナドは2つの随伴関手から構築できます。特に、CとDがカテゴリで、 F:C-> DとG:D-> Cが随伴関手である場合、全単射があるという意味で
hom(FX、Y)= hom(X、GY)
CのXとDのYごとに、合成G o F:C->Cはモナドです。
随伴関手のそのようなペアの1つは、型b
を固定し、取るF
となることによって与えることができG
ます
data F b a = F (a,b)
data G b a = G (b -> a)
instance Functor (F b) where
fmap f (F (a,b)) = F (f a, b)
instance Functor (G b) where
fmap f (G g) = G (f . g)
そして、hom-sets間の全単射は、カリー化によって与えられます(モジュロコンストラクター)。
iso1 :: (F b a -> c) -> a -> G b c
iso1 f = \a -> G $ \b -> f (F (a,b))
iso2 :: (a -> G b c) -> F b a -> c
iso2 g = \(F (a,b)) -> let (G g') = g a in g' b
この場合、対応するモナドは
data M b a = M { unM :: b -> (a,b) }
instance Monad (M b) where
return a = M (\b -> (a,b))
(M f) >>= g = M (\r -> let (a,r') = f r in unM (g r') a)
このモナドの名前がどうあるべきかはわかりませんが、上書き可能な情報の一部を運ぶリーダーモナドのようなもののようです(編集:State
dbauppはコメントでこれがモナドであると指摘しています。 )。
したがって、State
モナドは随伴関手とのペアとして「分解」することF
ができ、次のG
ように書くことができます。
State = G . F
ここまでは順調ですね。
私は今、他の一般的なモナドを随伴関手のペアに分解する方法を理解しようとしています-たとえば、、、、-Maybe
しかし[]
、それらReader
を「分解」できる随伴関手のペアが何であるかを理解することはできません。Writer
Cont
唯一の単純なケースはモナドであるように思われます。これは、ファンクターのIdentity
任意のペアに分解でき、逆になります(特に、とをとることができます)。F
G
F
G
F = Identity
G = Identity
誰かが光を当てることができますか?