Devam Monadını Sol ve Sağ Bağlantılara Nasıl Çarpar?


11

Devlet monad Ürün (Sol - Functor) ve Okuyucu (Sağ Temsil Edilebilir) içine çarpanlarına ayrılabilir.

  1. Devam Monad'ı çarpanlarına ayırmanın bir yolu var mı? Kod aşağıda benim girişim, hangi tip kontrol alışkanlık
-- 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. Monadları oluşturan Sol ve Haklar Bağlantılarının bir listesi var mı?

  2. 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ı?

Yanıtlar:


11

Sınıf kontrol edilmez, çünkü sınıf Adjunctionsadece 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, counitOp (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, Functorve Adjunctionkategorileri 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 Composebir 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 Contbunun ö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 Mgibi 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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.