Каждая свободная монада над??? функтор дает comonad?

В этом ответе: "Может ли монада быть комонадой?" мы видим, что

Каждый Cofree Comonad над Альтернативный функтор дает Monad.

Что было бы двойственным? Существует ли класс функторов, который автоматически делает свободную монаду над ними comonad?

Ответ 1

Ну да, вы можете дуализировать конструкцию, но единственным членом результирующего класса является пустой функтор, чья свободная монада (тождественная монада) действительно также является комонадой. Не очень интересно.

Конструкция, на которую вы ссылаетесь, на самом деле нуждается в довольно небольшом количестве, поэтому вы можете отказаться от багажа Хаска и работать в следующей общности. Пусть

  • (C, ⊗, 1) - моноидальная категория

  • F: C → C - моноиднозначный функтор, т.е. существуют отображения 1 → FX и FX ⊗ FX → FX, естественные в X, а унитальные и ассоциативные

    /li >

Определить TX = X ⊗ F (TX). Предположим, что это рекурсивное определение имеет смысл, и мы можем сделать рекурсивные определения на Т. Тогда мы можем превратить Т в монаду со следующими структурными отображениями:

  • единица, заданная

        X = X ⊗ 1
         -> X ⊗ F(TX)            [unit map of F]
          = TX
    
  • объединение, заданное

    T(TX) = TX ⊗ F(TTX)
          = X ⊗ F(TX) ⊗ F(TTX)
         -> X ⊗ F(TX) ⊗ F(TX)    [join recursively under F]
         -> X ⊗ F(TX)            [multiplication of F]
          = TX
    

Когда ⊗ - декартово произведение, эта конструкция является структурой монады на свободной комонаде на альтернативном функторе, к которому вы обращаетесь. Фактически, Применительная часть Альтернативной структуры не имеет значения. Нужны только классные методы Альтернативы (плюс Functor): моноиднозначный функтор. Элементарно, шаги, которые составляют соединение, как описано выше, даются

(x :< xs) :< xss  ->  (x :< xs, xss)
                  ->  (x, xs, xss)
                  ->  (x, xs, fmap join xss)
                  ->  (x, xs <|> fmap join xss)
                  ->  x :< (xs <|> fmap join xss)

и это легко увидеть (установив k = id), чтобы согласиться с

(a :< m) >>= k = case k a of
                   b :< n -> b :< (n <|> fmap (>>= k) m)

Поскольку наша первоначальная структура была настолько минимальной, она легко дуализирована. Итак, пусть (C, ⊗, 1) остаются моноидальной категорией, но теперь предположим, что

  • G: C → C - комоидоподобный функтор, т.е. существуют отображения GX → 1 и GX → GX ⊗ GX, естественные в X, а врожденные и коассоциативные

Тогда мы можем определить UX = X ⊗ G (UX) (опять-таки полагая, что это как-то имеет смысл) и двойственными конструкциями оборудуют U структурой сонады. Это в некотором смысле настоящий ответ здесь, но для решения вашего конкретного вопроса мы должны рассмотреть, что происходит для некоторых конкретных вариантов ⊗.

Сначала предположим, что ⊗ снова является декартовым произведением. Тогда каждый функтор G кономиозначен однозначно (неотрицательность заставляет GX → GX x GX быть диагональю). Итак, для любого функтора G мы получаем comonad UX = X x G (UX). На самом деле это оказывается просто обычной cofree comonad на конструкторе функтора (оправдывая часть "cofree comonad" вашего лозунга, а если F моноиднозначна, мы можем установить G = F, а G автоматически комонидозначна, а затем T и U имеют один и тот же базовый функтор).

Дуально, если ⊗ - копроизведение ⨿, то любой G, который является кономиозначным для ⨿, также моноиднозначен для ⨿ единственным образом, поэтому UX = X ⨿ G (UX) также является свободной монадой на G как комонад.

Но в Hask единичный объект для ⨿ является пустым типом 0, и предполагается, что у кассита G есть тип GX → 0, что возможно только тогда, когда GX = 0 для всех X (это верно в любом декартовом закрытая категория). Итак, интересных примеров этой конструкции в Хаске нет. Это отсутствие симметрии является типичным явлением категорий, которые напоминают Set.