Что такое class Comonad в Haskell?

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

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

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

  1. Оценка клеточных автоматов является comonadic . В частности, «всякий раз, когда вы видите большие структуры данных, собранные из множества небольших, но похожих вычислений, есть хороший шанс, что мы имеем дело с comonad».
  2. Последовательности, streamи и сегменты
  3. Комонад в повседневной жизни

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

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

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

 return :: a ~> ma flip (>>=) :: (a ~> mb) -> (ma ~> mb) 

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

 extract :: a <~ wa extend :: (a <~ wb) -> (wa <~ wb) 

(Написано обычными стрелками)

 extract :: wa -> a extend :: (wa -> b) -> wa -> wb 

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

  • Haskell: Что такое нормальная форма слабой головы?
  • Как вы представляете график в Haskell?
  • Крупномасштабный дизайн в Haskell?
  • Лучшее исключение для неисчерпывающих шаблонов в случае
  • В чем разница между . (точка) и $ (знак доллара)?
  • Интегральные операторы quot vs. div
  • Типы Haskell расстраивают простую «среднюю» функцию
  • Как группировать похожие элементы в списке с помощью Haskell?
  • Почему 3 и x (которые были назначены 3) имеют разные предполагаемые типы в Haskell?
  • Неверный порядок операций ввода-вывода с использованием putStr и getLine
  • Что плохого в ленивом вводе-выводе?
  • Давайте будем гением компьютера.