연속 모나드를 왼쪽 및 오른쪽 인접 요소로 분해하는 방법은 무엇입니까?


11

State monad는 Product (Left-Functor) 및 Reader (Right-Representable)로 분해 할 수 있습니다.

  1. Continuation Monad를 분해하는 방법이 있습니까? 아래 코드는 확인을 입력하지 않는 내 시도입니다.
-- 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. 모나드를 형성하는 Left & Rights Adjoints 목록이 있습니까?

  2. 나는 한 쌍의 인접 어가 주어지면 고유 한 Monad & Comonad를 형성하지만 Monad가 주어지면 여러 요소로 인수 분해 될 수 있음을 읽었습니다. 이것에 대한 예가 있습니까?

답변:


11

이 클래스 Adjunction는 두 기능이 Hask의 endofunctors 인 작은 부속 집합만을 나타 내기 때문에 타입 검사하지 않습니다 .

결과적으로 이것은 adjunction의 경우가 아닙니다 (<-:) r -| (<-:) r. 여기에는 미묘하게 다른 두 가지 펑터가 있습니다.

  • f = (<-:) r, Hask에서 Op (Hask)까지의 functor (Hask의 반대 범주, 때로는 Hask ^ op라고도 함)
  • g = (<-:) r, Op (Hask)에서 Hask까지의 펑터

특히, counitOp (Hask) 범주에서 자연스럽게 변형되어야합니다.

unit   :: a -> g (f a)
counit :: f (g a) <-: a

실제로이 부속서에서 counit일치 unit합니다.

이를 제대로 포착하려면 클래스 FunctorAdjunction클래스 를 일반화해야 서로 다른 카테고리 간의 부속물을 모델링 할 수 있습니다.

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


나는 한 쌍의 인접 어가 주어지면 독특한 Monad & Comonad를 형성하지만 Monad가 주어지면 여러 요소로 인수 분해 될 수 있음을 읽었습니다. 이것에 대한 예가 있습니까?

인수 분해는 일반적으로 고유하지 않습니다. 위와 같이 adjunctions를 일반화 한 후에는 최소한 MKleisli 범주와 기본 범주 (이 경우 Hask) 사이의 admonction으로 모나드를 고려할 수 있습니다.

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의 endofunctor 사이의 부속에 해당하는지 여부를 모르겠습니다.

모나드에 관한 nCatLab 기사를 참조하십시오 : https://ncatlab.org/nlab/show/monad#RelationToAdjunctionsAndMonadicity

부속 및 모나 디 시티와의 관계

모든 부속물 (L⊣R)은 모나드 R∘L 및 코 모나드 L∘R을 유도한다. 일반적으로 주어진 모나드를 이러한 방식으로 발생시키는 하나 이상의 부속물이 있으며, 실제로 주어진 모나드에 대한 부속물 범주가 있습니다. 해당 범주의 초기 개체는 모나드의 Kleisli 범주에 대한 부속물이고 터미널 개체는 Eilenberg-Moore 범주의 대수에있는 것입니다. (예 : Borceux, 2 권, 발의안 4.2.2) 후자는 monadic adjunction이라고한다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.