วิธีแยกตัวประกอบความต่อเนื่อง Monad ให้เป็น Adjoints ด้านซ้ายและขวา


11

เนื่องจากสถานะ monad สามารถแยกเป็นผลิตภัณฑ์ (ซ้าย - Functor) และ Reader (ขวา - แทนได้)

  1. มีวิธีในการแยกแยะความต่อเนื่องของ 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. มีรายการ Adjoint ของ Left & Rights ที่สร้าง monads หรือไม่?

  2. ฉันได้อ่านแล้วเมื่อได้รับ adjoints คู่หนึ่งพวกเขาสร้าง Monad & Comonad ที่ไม่เหมือนใคร มีตัวอย่างอะไรบ้าง?

คำตอบ:


11

นี้ไม่ได้เพราะ typecheck ชั้นAdjunctionเพียงหมายถึงกลุ่มย่อยขนาดเล็กของ adjunctions ที่ทั้ง functors มีendofunctors บนHAŠK

ตามที่ปรากฎว่านี่ไม่ใช่กรณีของส่วน(<-:) r -| (<-:) rต่อขยาย มีฟังก์ชันที่แตกต่างกันสองอย่างที่นี่:

  • f = (<-:) rนักแต่งเพลงจาก Hask to Op (Hask) (หมวดตรงข้ามของ Hask บางครั้งก็แทน Hask ^ op)
  • g = (<-:) rนักแต่งเพลงจาก Op (Hask) ถึง Hask

โดยเฉพาะอย่างยิ่งการแปลงcounitควรเป็นแบบธรรมชาติในหมวดหมู่ Op (Hask) ซึ่งพลิกลูกศรไปรอบ ๆ :

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เป็น monad (และ comonad ถ้าเราพลิกส่วนเสริม):

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


ฉันได้อ่านแล้วว่าให้ adjoints คู่หนึ่งซึ่งสร้าง Monad & Comonad ที่ไม่ซ้ำกัน แต่ให้ Monad มันสามารถแยกตัวประกอบออกเป็นหลายปัจจัย มีตัวอย่างอะไรบ้าง?

การแยกตัวประกอบโดยทั่วไปแล้วจะไม่ซ้ำกัน เมื่อคุณได้คำเสริมทั่วไปข้างต้นแล้วอย่างน้อยคุณสามารถแยกส่วนของ monad ใด ๆMเป็นส่วนเสริมระหว่างหมวดหมู่ Kleisli กับหมวดหมู่พื้นฐาน (ในกรณีนี้คือ Hask)

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 (=<<)

ฉันไม่รู้ว่า monad ที่ต่อเนื่องนั้นสอดคล้องกับส่วนเชื่อมต่อระหว่าง endofunctors บน Hask หรือไม่

ดูเพิ่มเติมที่บทความ nCatLab เกี่ยวกับ monads: https://ncatlab.org/nlab/show/monad#RelationToAdjunctionsAndMonadicity

ความสัมพันธ์กับ adjunctions และ monadicity

ตัวต่อ (L ⊣ R) ทุกตัวทำให้ Monad R∘Lและ Comonad L∘Rเป็นตัวกระตุ้น โดยทั่วไปมีตัวเชื่อมมากกว่าหนึ่งตัวที่ทำให้เกิด monad ที่กำหนดด้วยวิธีนี้ในความเป็นจริงมีหมวดหมู่ของ adjunctions สำหรับ monad ที่กำหนด วัตถุเริ่มต้นในหมวดหมู่นั้นเป็นส่วนเสริมของหมวด Kleisli ของ monad และวัตถุเทอร์มินัลคือเหนือ algebras หมวดหมู่ Eilenberg-Moore (เช่น Borceux, vol. 2, prop. 4.2.2) ส่วนหลังเรียกว่า monadic adjunction

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.