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


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

бонусные баллы за указание" реальной жизни "использования Comonad в" реальном " коде.

2 101

2 ответа:

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

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

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

" 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 в этот слот, результатом является стрелка идентичности. Законы те же, "только со стрелками перевернутыми". Это супер handwavey ответ, но, надеюсь, он дает некоторое представление.