Sınıf kontrol edilmez, çünkü sınıf Adjunction
sadece her iki işlevin de Hask'ta endofunktör olduğu küçük bir ayar alt kümesini temsil eder .
Görünen o ki, sıfat için durum böyle değil (<-:) r -| (<-:) r
. Burada iki farklı işlev vardır:
f = (<-:) r
, Hask'tan Op'a (Hask) functor (Hask'ın zıt kategorisi, bazen Hask ^ op olarak da belirtilir)
g = (<-:) r
, Op (Hask) 'dan Hask' a functor
Özellikle, counit
Op (Hask) kategorisinde, okları çevreleyen doğal bir dönüşüm olmalıdır:
unit :: a -> g (f a)
counit :: f (g a) <-: a
Aslında, bu sıfatla counit
çakışır unit
.
Bunu düzgün bir şekilde yakalamak için, Functor
ve Adjunction
kategorileri genelleştirmemiz gerekir, böylece farklı kategoriler arasındaki sıfatları modelleyebiliriz:
class Exofunctor c d f where
exomap :: c a b -> d (f a) (f b)
class
(Exofunctor d c f, Exofunctor c d g) =>
Adjunction
(c :: k -> k -> Type)
(d :: h -> h -> Type)
(f :: h -> k)
(g :: k -> h) where
unit :: d a (g (f a))
counit :: c (f (g a)) a
Sonra tekrar Compose
bir monad (ve sıfatı çevirirsek bir comonad) alırız:
newtype Compose f g a = Compose { unCompose :: f (g a) }
adjReturn :: forall c f g a. Adjunction c (->) f g => a -> Compose g f a
adjReturn = Compose . unit @_ @_ @c @(->)
adjJoin :: forall c f g a. Adjunction c (->) f g => Compose g f (Compose g f a) -> Compose g f a
adjJoin = Compose . exomap (counit @_ @_ @c @(->)) . (exomap . exomap @(->) @c) unCompose . unCompose
ve Cont
bunun özel bir durumudur:
type Cont r = Compose ((<-:) r) ((<-:) r)
Daha fazla ayrıntı için bu özete de bakın: https://gist.github.com/Lysxia/beb6f9df9777bbf56fe5b42de04e6c64
Bir çift bitişik olarak benzersiz bir Monad ve Comonad oluşturduklarını ancak bir Monad verildiğinde birden fazla Faktöre Faktörleştirilebileceğini okudum. Bunun bir örneği var mı?
Çarpanlara ayırma işlemi genellikle benzersiz değildir. Yukarıdaki M
gibi sıfatları genelleştirdikten sonra, en azından herhangi bir monad'ı Kleisli kategorisi ve temel kategorisi (bu durumda Hask) arasında bir sıfat olarak hesaba katabilirsiniz.
Every monad M defines an adjunction
F -| G
where
F : (->) -> Kleisli M
: Type -> Type -- Types are the objects of both categories (->) and Kleisli m.
-- The left adjoint F maps each object to itself.
: (a -> b) -> (a -> M b) -- The morphism mapping uses return.
G : Kleisli M -> (->)
: Type -> Type -- The right adjoint G maps each object a to m a
: (a -> M b) -> (M a -> M b) -- This is (=<<)
Devam monadının Hask'taki endofunktörler arasındaki bir sıfıra karşılık gelip gelmediğini bilmiyorum.
Monads hakkındaki nCatLab makalesine de bakın: https://ncatlab.org/nlab/show/monad#RelationToAdjunctionsAndMonadicity
Sıfatlar ve monadisite ilişkisi
Her bir sıfat (LR) bir monad R∘L ve bir comonad L∘R indükler. Genel olarak, belirli bir monadın bu şekilde ortaya çıkmasına neden olan birden fazla sıfat vardır, aslında belirli bir monad için bir sıfat kategorisi vardır. Bu kategorideki ilk nesne, monadın Kleisli kategorisine ve terminal nesnesine, Eilenberg-Moore cebir kategorisine göre olan ayardır. (örn. Borceux, cilt 2, prop 4.2.2) İkincisine monadik sıfat adı verilir.