Что такое класс типов Comonad в Haskell?

105

Что такое класс типов Comonad в Haskell? Как и в Comonad от Control.Comonad в пакете comonad (также приветствуются объяснения любых других пакетов, которые предоставляют класс типов Comonad). Я смутно слышал о Comonad, но все, что я действительно знаю о нем, - это то, что это обеспечивает extract :: w a -> a, своего рода параллель с Monad return :: a -> m a.

Бонусные баллы за «реальное» использование Comonad в «реальном» коде.

Дэн Бертон
источник
Мне бы очень хотелось увидеть, в чем разница между «co» и нормальным. Я знаю, что такое монада. Так что, если я знаю, что означает «со», я могу сделать вывод, что такое комонада, и глубоко это понять. Ответ Алексея Романова в этом плане ничего не сделал.
Evi1M4chine 01
2
@ Evi1M4chine: «co» (в широком смысле) означает «щелкнуть стрелками». Вот примерное изображение этого. Рассмотрим монадические операции: return :: a ~> m a, flip bind :: (a ~> m b) -> (m a ~> m b). Поменяйте волнистые стрелки , и вы получите comonadic операции: extract :: a <~ w a, extend :: (a <~ w b) -> (w a <~ w b)( extract :: w a -> a, extend :: (w a -> b) -> w a -> w b)
Дэн Бертон
Спасибо, @Dan Burton ... так что, работая с монадой, вы работаете «внутри» (вставляя новые и измененные вещи внутрь), с комонадой вы работаете «снаружи» (вынимая вещи окончательно или просто чтобы их изменить) . Это мнение правильное? Потому что это, безусловно, очень помогает с глубоким пониманием.
Evi1M4chine
комонады могут использоваться для моделирования коэффектов. Вот отличное введение в коэффекты: tomasp.net/coeffects
zeronone 08

Ответы:

83

Эти ссылки могут быть полезны:

  1. Оценка клеточных автоматов комонадна . В частности, «всякий раз, когда вы видите большие структуры данных, составленные из множества небольших, но похожих вычислений, есть большая вероятность, что мы имеем дело с комонадой».
  2. Последовательности, потоки и сегменты
  3. Комонады в повседневной жизни
Алексей Романов
источник
1
+1 Первая ссылка действительно собрала меня воедино.
Луки
43
Ответ только для ссылки должен как минимум содержать краткое изложение связанного содержимого. В настоящее время этот ответ не подходит для того, чтобы быть хорошим ответом SO. Подумайте о том, чтобы немного расширить его, чтобы он мог работать самостоятельно без связанных статей.
Bakuriu
3
«всякий раз, когда вы видите большие структуры данных, составленные из множества небольших, но похожих вычислений, есть большая вероятность, что мы имеем дело с комонадой» .... Значит ли это, что фрагментные шейдеры комонадны?
Сэм Келлетт
1
Я нашел этот пример из , extendчтобы быть полезным.
Крис Пеннер,
22

Это не полностью отвечает на мой вопрос, но я хотел поместить некоторую соответствующую информацию в формате ответа:

«co» (свободно) означает «перевернуть стрелки». Вот примерное изображение этого.

Рассмотрим монадические операции:

return :: a ~> m a
flip (>>=) :: (a ~> m b) -> (m a ~> m b)

Переверните волнистые стрелки, и вы получите комонадные операции:

extract :: a <~ w a
extend :: (a <~ w b) -> (w a <~ w b)

(Пишется обычными стрелками)

extract :: w a -> a
extend :: (w a -> b) -> w a -> w b

Обратите внимание на то, как в этом формате returnстрелка помещается в слот аргумента для flip (>>=), и то же самое верно для extractи extend. Законы монад / комонад гласят, что когда вы вставляете returnили extractв этот слот, в результате появляется стрелка идентичности. Законы те же, «только стрелки перевернуты». Это очень простой ответ, но, надеюсь, он дает некоторое представление.

Дэн Бертон
источник
2
Ваш ответ хорошо сочетается с тем, чтобы избежать ошибки в учебнике по монаде. Монады (и комонады) - это просто интерфейс. Хотя было бы действительно здорово узнать, как они были задуманы . Как в: Идея, стоящая за ними.
Evi1M4chine