Это не полностью отвечает на мой вопрос, но я хотел поместить некоторую соответствующую информацию в формат ответа:
«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
в этот слот, результатом является стрелка идентификации.Законы одинаковы, «просто с стрелками перевернутыми».Это супер ручной ответ, но, надеюсь, он даст некоторое представление.