Любая монада также является аппликативным функтором, а любой аппликативный функтор - функтором. Также любая комонада является функтором. Существует ли похожая концепция между комонадами и функторами, что-то вроде ко-аппликативного функтора, и каковы его свойства?
Обновление: я был бы также заинтересован в возможном использовании такой концепции.
ct.category-theory
monad
applicative
comonad
Петр Пудлак
источник
источник
Ответы:
Прежде всего:
Это верно в контексте Haskell, но (читается
Applicative
как «сильный слабый моноидальный функтор») не в общем, по довольно тривиальной причине, по которой вы можете иметь «аппликативные» функторы между различными моноидальными категориями, тогда как монады (и комонады) являются эндофункторами ,Кроме того, отождествление
Applicative
с сильными слабыми моноидальными функторами немного вводит в заблуждение, поскольку для обоснования имени (и сигнатуры типа(<*>)
) требуется функтор между замкнутыми моноидальными категориями, который сохраняет как моноидальную структуру, так и внутренний гом . Это можно правдоподобно назвать «слабым замкнутым моноидальным функтором», за исключением того, что функтор между моноидальными замкнутыми категориями, который сохраняет одно свойство, сохраняет другое очевидным образом . ТакApplicative
описывает только endofunctors на Hask сохранения моноидальных структур(,)
, его экземпляры получить много свойств автоматически, включая их силу , которые , таким образом , могут быть опущены.Кажущаяся связь с
Monad
, возможно, является артефактом неявных ограничений наApplicative
совпадение аспектов их соответствующих моноидных структур, счастливое совпадение, которое, к сожалению, не переживает дуализации.Так же, как комонада категории является монадой на C o p , оплаксный моноидальный функтор C → D является слабым моноидальным функтором C o p → D o p . Но H a s k o p не является моноидально замкнутым , и кооперация , не включающая в себя применение функции, вряд ли заслуживает названия. В любом случае, результат не был бы ужасно интересным:С Со п С→ D Со п→ Dо п ЧАСа с ко п
Applicative
Applicative
newtype Op b a = Op (a -> b)
Op b a
Applicative
Конечно, добавление
duplicate :: f a -> f (f a)
кcopure
будет производить комонаду (при условии соблюдения законов). Но нет очевидной связи между -coap
чем бы это ни было - иextend :: (f a -> b) -> f a -> f b
. При сравнении типов становится ясно, что дуализация происходит по-разному: комоноидальные структуры лежат в основеduplicate
иcozip
имеют мало общего друг с другом или сcoap
(что, вероятно, в любом случае не имеет смысла), тогда какliftA2 (,)
и(<*>)
являются эквивалентными и могут быть получены изjoin
.Другой возможный способ дуализации
Applicative
, который имеет еще меньшее отношение к комадам, заключается в рассмотрении контравариантных моноидальных функторов:b <~ a
contracurry :: (Either c b <~ a) -> (c <~ (b <~ a))
contraapply :: b -> Either a (a <~ b)
CoApplicative
Однако в моноидальной закрытой категории, более гостеприимной к дуализации, вам может повезти больше. В частности, я считаю, что обе
Kleisli (Cont r)
и их противоположные категории моноидально замкнуты, так что это может быть лучшим контекстом для изучения этих идей.источник
В этом посте на SO я нашел интересный ответ - решающие функторы . Если мы заменим
()
наVoid
,(,)
поEither
и реверс стрелки, мы получим:В блоге также приведены некоторые законы, которых придерживаются решающие функторы.
И каждый
Comonad
такжеDecisive
:Таким образом, решающие функторы вписываются между функторами и комонадами так же, как аппликативные функторы вписываются между функторами и монадами.
источник
Макбрайд и Паттерсон (раздел 7) показывают, что аппликативный функтор, также известный как идиома, является сильным слабым моноидальным функтором . Вы ищете сильный моноидальный функтор колакса, также известный как сильный моноидальный функтор оплакс . Как упомянуто в комментарии, моноидальный функтор oplax является слабым моноидальным функтором между противоположными категориями, который в конечном итоге является комоноидальной версией слабого моноидального функтора.
Нарисуйте диаграммы, переверните стрелки!
Мне пришлось бы потратить немного времени на разработку деталей, чтобы понять, что это такое, и перевести это в концепцию функционального программирования.
источник