Làm thế nào để xác định đơn vị tiếp tục thành các điều chỉnh trái và phải?


11

Vì trạng thái đơn nguyên có thể được nhân tố thành Sản phẩm (Trái - Functor) và Đầu đọc (Phải - Đại diện).

  1. Có cách nào để nhân tố Monad tiếp tục không? Dưới đây mã là nỗ lực của tôi, không gõ kiểm tra
-- 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. Có một danh sách các Điều chỉnh trái & quyền hình thành các đơn nguyên không?

  2. Tôi đã đọc rằng, được cung cấp một cặp bổ trợ, chúng tạo thành một Monad & Comonad độc đáo, nhưng, với một Monad, nó có thể được Nhân tố hóa thành nhiều yếu tố. Có ví dụ nào về điều này?

Câu trả lời:


11

Điều này không đánh máy vì lớp Adjunctionchỉ đại diện cho một tập hợp nhỏ các điều chỉnh, trong đó cả hai hàm đều là endofunctor trên Hask .

Hóa ra, đây không phải là trường hợp của sự điều chỉnh (<-:) r -| (<-:) r. Có hai functor tinh tế khác nhau ở đây:

  • f = (<-:) r, functor từ Hask đến Op (Hask) (loại đối lập của Hask, đôi khi cũng được ký hiệu là Hask ^ op)
  • g = (<-:) r, functor từ Op (Hask) đến Hask

Cụ thể, counitnên là một phép biến đổi tự nhiên trong danh mục Op (Hask), giúp lật các mũi tên xung quanh:

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

Trong thực tế, counittrùng với unittrong điều chỉnh này.

Để nắm bắt điều này một cách chính xác, chúng ta cần khái quát hóa các lớp FunctorAdjunctionđể chúng ta có thể mô hình hóa các điều chỉnh giữa các loại khác nhau:

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

Sau đó, chúng tôi nhận được một lần nữa đó Composelà một đơn nguyên (và một comonad nếu chúng ta lật điều chỉnh):

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

Contchỉ đơn thuần là một trường hợp đặc biệt về điều đó:

type Cont r = Compose ((<-:) r) ((<-:) r)

Xem thêm ý chính này để biết thêm chi tiết: https://gist.github.com/Lysxia/beb6f9df9777bbf56fe5b42de04e6c64


Tôi đã đọc được rằng với một cặp bổ trợ, chúng tạo thành một Monad & Comonad độc đáo nhưng được cung cấp một Monad, nó có thể được nhân tố thành nhiều yếu tố. Có ví dụ nào về điều này?

Các yếu tố nói chung không phải là duy nhất. Khi bạn đã khái quát các điều chỉnh như trên, thì ít nhất bạn có thể tính bất kỳ đơn nguyên nào Mdưới dạng điều chỉnh giữa danh mục Kleisli và danh mục cơ sở của nó (trong trường hợp này là 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 (=<<)

Tôi không biết liệu đơn nguyên tiếp tục có tương ứng với một sự điều chỉnh giữa các endofunctor trên Hask hay không.

Xem thêm bài viết nCatLab về các đơn nguyên: https://ncatlab.org/nlab/show/monad#RelationToAdjiftsAndMonadicity

Liên quan đến điều chỉnh và đơn điệu

Mọi điều chỉnh (L R) tạo ra một R∘L đơn âm và một L∘R đơn âm. Nhìn chung, có nhiều hơn một điều chỉnh làm phát sinh một đơn vị nhất định theo cách này, trên thực tế có một danh mục các điều chỉnh cho một đơn vị nhất định. Đối tượng ban đầu trong thể loại đó là sự điều chỉnh đối với thể loại Kleisli của đơn nguyên và đối tượng đầu cuối là đối với thể loại đại số Eilenberg-Moore. (ví dụ Borceux, quyển 2, prop. 4.2.2) Cái sau được gọi là điều chỉnh đơn âm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.