Читатель, писатель монад

17

Пусть будет CCC . Пусть быть бифунктором продукта на . Так как Cat - это CCC, мы можем карри (\ times) :С(×)С(×)

curry(×):C(CC)

curry(×)A=λB.A×B

Функторная категория CC имеет обычную моноидальную структуру. Моноид в CC является монадой C . Рассматриваются конечные продукты , как моноидальные структуры на C .

curry(×)1id

A B.curry(×)(A×B)(curry(×)A)(curry(×)B)

Поэтому (curry(×)) сохраняет моноидальную структуру, поэтому он переносит моноид в монаду и комоноид в комонаду. А именно, он переносит произвольный моноид w в монаду (Writer w) (посмотрите на определение - w должен быть моноидом). Точно так же он переносит диагональный комоноид в комонаду Coreader.

Теперь, для конкретности, я раскрываю конструкцию Writer.

Начать. На самом деле Writer=Coreader=curry(×) , они просто имеют разные имена в Haskell. У нас есть моноид Haskell w,mappend,mempty :

mappend:w×ww

mempty:1w

Writer функтор, поэтому необходимо сопоставить также морфизмов, такие как и . Я пишу это, как показано ниже, хотя в Haskell это недопустимо:м е т р т умaппеNdмемпTY

WряTер мaппеNd:WряTер(вес×вес)WряTер вес

WряTер мaппеNd является естественным преобразованием, морфизм в . По свойствам это функция, которая принимает и дает морфизм в :c u r r y ( × ) a O b ( C ) CССсUррY(×)aОб(С)С

WряTер мaппеNd aзнак равномaппеNd×(яd(a)):WряTер(вес×вес)aWряTер вес a

Неформально суммирует компоненты типа и насосы нетронутыми. Это в точности определение Writer в Haskell. Одним из препятствий является то, что для монады нам нужнош Ш т я т е р ш , μ , п WряTер мaппеNd aвесaWряTер вес,μ,η

μ:WряTер весWряTер весWряTер вес

т.е. несовместимость типов. Но эти функторы изоморфны: обычным ассоциатором для конечных произведений, который является естественным изоморфизмом . Затем мы определяем через . Я опускаю конструкцию через .λ a . ш × ( ш × ) = Ш г я т е р ш Ш т я т е р ш μ Ш т я т е р м р р еWряTер(вес×вес)знак равноλa,(вес×вес)×aλa,вес×(вес×a)знак равноWряTер весWряTер весμП м е т р т уWряTер мaппеNdηмемпTY

Writer, будучи функтором, сохраняет коммутативные диаграммы, т. Е. Сохраняет моноидные равенства, поэтому мы имеем само собой разумеется доказанные равенства для = моноид в = монаде в . Конец.( С С ) СWряTер вес,μ,η(СС)С

Как насчет Reader и Cowriter? Reader присоединяется к Coreader, как описано в определении Coreader, см. Ссылку выше. Точно так же Cowriter присоединяется к Writer. Я не нашел определения Cowriter, поэтому составил его по аналогии, приведенной в таблице:

альтернативный текст

{- base, Hackage.category-extras -}
import Control.Comonad
import Data.Monoid
data Cowriter w a = Cowriter (w -> a)
instance Functor (Cowriter w) where
    fmap f (Cowriter g) = Cowriter (f . g)
instance Monoid w => Copointed (Cowriter w) where
    extract (Cowriter g) = g mempty
instance Monoid w => Comonad (Cowriter w) where
    duplicate (Cowriter g) = Cowriter
        (\w' -> Cowriter (\w -> g (w `mappend` w')))

Ниже приведены упрощенные определения этих (со) монад. fr_ob F обозначает отображение функтора F на объекты, fr_mor F обозначает отображение функтора F на морфизмы. Существует моноид объект в .Свес,+^,0^С

  • писатель
    • fr_ob(Writer w)a=a×w
    • fr_mor(Writer w)f=λa0,w2.a0,f w2
    • ηa=λa0.a0,0^
    • μa=λa0,w1,w0.a0,w0+^w1
  • читатель
    • fr_ob(Reader r)a=ra
    • fr_mor(Reader r)f=λg r0.f(g r0)
    • ηa=λa0 r0.a0
    • μa=λf r0.f r0 r0
  • Coreader
    • fr_ob(Coreader r)a=r×a
    • fr_mor(Coreader r)f=λr0,a0.f r0,a0
    • ηa=λr0,a0.a0
    • μa=λr0,a0.r0,r0,a0
  • Cowriter
    • ер_об(СовесряTер вес)aзнак равновесa
    • ер_мор(СовесряTер вес)езнак равноλграмм р0,е(грамм р0)
    • ηaзнак равноλе,е 0^
    • μaзнак равноλе вес1вес0,е(вес0+^вес1)

Вопрос в том, что присоединение в относится к функторам, а не к монадам. Я не понимаю, как в присоединении подразумевается «Coreader - это комонада» «Reader - это монада», а «Writer - это монада» «Cowriter - это комонада».С

Замечание. Я изо всех сил стараюсь предоставить больше контекста. Это требует некоторой работы. Особенно, если вам требуется категоричная чистота и эти (со) монады были введены для программистов. Продолжай ныть! ;)

beroal
источник
Предложение: Вы можете сделать скриншот таблицы и разместить изображение здесь.
MS Dousti 11.10.10
Вы должны скопировать вопрос здесь.
Дейв Кларк,
2
люди, понижающие голосование, должны оставить комментарий, объясняющий почему.
Суреш Венкат
1
@Ohad. Признаюсь, что я ввел это изменение, чтобы попытаться придать вопросу больше контекста (как было первоначально найдено в посте, на который изначально ссылались). Я думаю, что beroal следует потратить больше усилий на то, чтобы сделать свой вопрос самодостаточным, например, определив, что Reader и Writer, Coreader и Cowriter находятся в категориальных терминах или в Haskell, или в обоих, вместо того, чтобы предполагать, что мы все знаем, о чем идет речь.
Дэйв Кларк
2
@beroal: Я имел в виду, что, поскольку я не использую Haskell на ежедневной основе, парсинг кода на Haskell и переход на CT не являются тривиальными для меня и, возможно, для других. Перефразируя вопрос в чисто категоричных терминах, вы, скорее всего, получите ответ быстрее ...
Охад Каммар

Ответы:

13

Да, если монада имеет присоединенный справа N , то N автоматически наследует структуру comonad.M:CCNN

Общая теоретико-категоричная установка для понимания этого заключается в следующем. Пусть и D две категории. Напишите F u n ( C , D ) для категории функторов из C в D ; Его объекты - функторы, а его морфизмы - естественные преобразования. Напишите F u n L ( C , D ) для полной подкатегории F u n ( C , D )CDFun(C,D)CDFunL(C,D)Fun(C,D)на функторах, которые имеют правые примыкания (другими словами, мы рассматриваем функторы с правыми примыканиями и произвольными естественными преобразованиями между ними). Написать F R : D C для правого сопряженного функтора F : C D . Тогда - R : F u n L ( C , D ) F u n ( D , C ) является контравариантным функтором: если α : F CDFR:DCF:CDр:FUNL(С,D)FUN(D,С) представляет собой естественное преобразованието есть индуцированное естественное преобразование α R : G RF R .α:Fграммαр:граммрFр

Если , то F u n ( C , C ) имеет моноидальную структуру, заданную композицией, и F u n L ( C , D ) , потому что композиция левых примыканий является присоединенной слева. В частности, ( F G ) R = G R F R , поэтому - R - антимоноидальный контравариантный функтор. Если применить - R к структурным естественным преобразованиям, которые оснащают функтором MСзнак равноDFUN(С,С)FUNL(С,D)(FG)R=GRFRRRM со структурой монады, то, что вы получаете, является comonad.

Рейд Бартон
источник
1
И следует упомянуть, что некоторые из этих функторов, например самом деле не функтор, а скорее что-то вроде псевдо-функтора, потому что он обычно удовлетворяет функториальности только до канонических изоморфизмов. Тем не менее, главное утверждение действительно. R
Андрей Бауэр
7

Кстати, это:

Пусть будет бифунктор продукт C . Поскольку C является CCC, мы можем карри ( × )(×)CC(×)

немного неверно. С одной стороны , обычная терминология была бы (если я не ошибаюсь) , что является бифунктор более или C . «В» обычно означает конструкции, использующие стрелки и объекты категории, в то время как функторы «в» категориях относятся к конструкциям, связанным с несколькими категориями. И бифунктор продукта не является конструкцией в декартовой категории.×C

И это относится к большей неточности: способность каррировать бифунктор продукта не имеет ничего общего с тем, что является декартовой замкнутой. Скорее, это возможно, потому что C a t , категория категорий (вставка предостережения) является декартовой замкнутой. Таким образом, рассматриваемое карри определяется:CCat

HomCat(C×D,E)HomCat(C,ED)

где является продуктом категории, и Е D является категория функторов F : D E . Это работает независимо от того , являются ли C , D и E декартовыми замкнутыми. Когда мы позволяем C = D = E , мы получаем:C×DEDF:DECDEC=D=E

c u r r y × : C C C

×:C×CC
curry×:CCC

Но это всего лишь частный случай:

c u r r y F : C E D

F:C×DE
curryF:CED
Дэн Доэль
источник
2 Дэн Доэль: Да, да, да, спасибо. Я сделал ошибку при переводе с оригинального поста beroal.livejournal.com/23223.html .
Beroal
4

Рассмотрим примыкание . Для каждого такого примыкания мы имеем монаду G F , η , G & epsi F , а также комонада F G , ε , F П G . Следует отметить, что F и G не должен быть endofunctors, и в целом они не являются (например, список монады является adjuction между свободными и забывчивыми функторами между S е т и М O пF,G,ϵ,ηGF,η,GϵFFG,ϵ,FηGFGSetMon).

Итак, что вы хотите сделать, это взять Reader (или Writer) и разложить его на сопряженные функторы, которые дают начало монаде и соответствующей ей. То есть соединение между Reader и Coreader (или Writer и Cowriter) не является тем, которое вы ищете.

И это, вероятно , лучше думать о выделки , как , т.е. X , Y . { f : X × A Y } { f : X Y A } . Или, если это поможет, - : hom ( - × A ,:hom(×A,=)hom(,=A)X,Y. {f:X×AY}{f:XYA}:hom(×A,=×1)hom(1,=A)

Рен Романо
источник
2 Wrenng Thornton: я не знаю ни одного определяющего присоединения для Reader и Writer, подобного дополнениям между Set и категорией алгебраических структур. Или вы имеете в виду, что каждая монада определяется присоединением, как в "MacLane. Категории для рабочего математика. VI. Монады и алгебры. 2. Алгебры для монады. Теорема 1 (Каждая монада определяется своими T-алгебрами). «? Можете быть более конкретными? На самом деле мой вопрос - заключение о попытке определить эти (со) монады в изящных словах, как список монад.
beroal
@beroal: Я почти уверен, что Reader и Writer не связаны друг с другом, или, по крайней мере, я еще не нашел способ заставить категории работать с этим. Нет, я хотел сказать, что монады и комонады возникают «одинаково», а именно через присоединение, как описано выше. У меня нет копии MacLane, но да, алгебры являются стандартным названием для вышеприведенного трюка (но опять же, все виды несвязанных вещей называются «X-алгебрами», «Y-алгебрами», ... ). T
Рен Романо
F:SetMonU:MonSetη:idSetUFϵ:FUidMonF,U,η,ϵUF,η,UϵFSetMonFU,ϵ,FηU
Функторы (Reader a) и (Writer a) являются сопряженными, и это присоединение порождает монаду (State a).
Beroal
«Нет, я хотел сказать, что монады и комонады возникают« одинаково », а именно через присоединение, как описано выше». Если вы получите монаду и комонаду из соединения категорий Set и Mon, вы получите монаду Set и комонаду Mon - разные категории. Но Reader и Writer находятся в одной категории CCC.
Beroal