Як розділити монаду продовження на ліві та праві сполучення?


11

Оскільки державна монада може бути розподілена на продукт (ліворуч - функціонер) та читач (справа - представницький).

  1. Чи є спосіб факторизувати продовження Монади? Нижче коду - моя спроба, яка не перевіряю тип
-- To form a -> (a -> k) -> k
{-# LANGUAGE MultiParamTypeClasses, TypeOperators, InstanceSigs, TypeSynonymInstances #-}
type (<-:) o i = i -> o
-- I Dont think we can have Functor & Representable for this type synonym

class Isomorphism a b where
   from :: a -> b
   to :: b -> a

instance Adjunction ((<-:) e) ((<-:) e) where
   unit :: a -> (a -> e) -> e
   unit a handler = handler a

   counit :: (a -> e) -> e -> a
   counit f e = undefined -- If we have a constraint on Isomorphism a e then we can implement this
  1. Чи є список лівих та прав прилягаючих, які утворюють монади?

  2. Я читав, що, даючи пару примикань, вони утворюють унікальну Монаду та Комонад, але, маючи монаду, її можна розділити на декілька факторів. Чи є приклад цього?

Відповіді:


11

Це не перевіряється, тому що клас 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) Останнє називається монадичним доповненням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.