Це не перевіряється, тому що клас Adjunction
представляє лише невелику підмножину доповнень , де обидва функтори є ендофайнерами на Hask .
Як виявляється, це не стосується доповнення (<-:) r -| (<-:) r
. Тут є два тонко різні функтори:
f = (<-:) r
, функтор від Hask до Op (Hask) (протилежна категорія Hask, іноді також позначається Hask ^ op)
g = (<-:) r
, функтор від Op (Hask) до Hask
Зокрема, це counit
повинно бути природним перетворенням у категорії Оп (Хаск), яке обертає стрілки навколо:
unit :: a -> g (f a)
counit :: f (g a) <-: a
Фактично, counit
збігається з unit
цим доповненням.
Щоб правильно це зробити, нам потрібно узагальнити класи Functor
та Adjunction
класи, щоб ми змогли моделювати додатки між різними категоріями:
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
Тоді ми знову отримуємо, що Compose
це монада (і комонада, якщо ми перевернемо доповнення):
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
і Cont
є лише особливим випадком цього:
type Cont r = Compose ((<-:) r) ((<-:) r)
Дивіться також цей суть для більш детальної інформації: https://gist.github.com/Lysxia/beb6f9df9777bbf56fe5b42de04e6c64
Я читав, що, зважаючи на пару примикань, вони утворюють унікальну Монаду та Комонад, але, даючи Монаду, її можна розподілити на кілька факторів. Чи є приклад цього?
Факторизація, як правило, не є однозначною. Після того, як ви узагальнили додатки, як описано вище, ви можете принаймні M
зарахувати будь-яку монаду як доповнення між її категорією Клейслі та базовою категорією (в даному випадку Хаск).
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 (=<<)
Я не знаю, чи відповідає монада продовження примикання між ендофайнерами на Hask.
Дивіться також статтю nCatLab про монади: https://ncatlab.org/nlab/show/monad#RelationToAdjunctionsAndMonadicity
Ставлення до пристосувань і монадичності
Кожне приєднання (L ⊣ R) викликає монаду R∘L та комонаду L∘R. Загалом, існує більше ніж одна доба, яка породжує дану монаду таким чином, насправді існує категорія доповнень для даної монади. Початковим об'єктом цієї категорії є приєднання над категорією монади Клейслі, а кінцевим об’єктом є над алгебрами категорії Ейленберга-Мура. (напр. Borceux, т. 2, опора 4.2.2) Останнє називається монадичним доповненням.