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