Что такое класс Comonad в Haskell?
Что такое класс Comonad в Haskell? Как и в Comonad от Control.Comonad в пакете comonad (также приветствуются объяснения любых других пакетов, которые предоставляют класс Comonad). Я смутно слышал о Comonad, но все, что я действительно знаю об этом, это то, что предоставляет extract :: w a -> a
, своего рода параллель с Monad return :: a -> m a
.
Бонусные баллы за указание "реальной жизни" использования Comonad в "реальном" коде.
Ответы
Ответ 1
Эти ссылки могут быть полезны:
Ответ 2
Это не полностью отвечает на мой вопрос, но я хотел бы поместить некоторую релевантную информацию в формат ответа:
"co" (свободно) означает "перевернуть стрелки". Здесь грубо это видно.
Рассмотрим монадические операции:
return :: a ~> m a
flip (>>=) :: (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
Обратите внимание, что в этом формате return
- это стрелка, которая просто так подходит, чтобы она помещалась в слот аргумента для flip (>>=)
, и то же самое относится к extract
и extend
. Законы Монады/Комонады говорят, что когда вы помещаете return
или extract
в этот слот, результатом будет стрелка идентификации. Законы одинаковы, "просто с перевернутыми стрелами". Это супер ручной ответ, но, надеюсь, он дает некоторое представление.