Задумываясь о том, как обобщить монады, я придумал следующее свойство функтора F:
inject :: (a -> F b) -> F(a -> b)
- это должно быть естественное преобразование как для a, так и для b.
В отсутствие лучшего имени я вызываю функтор F bindable, если существует естественное преобразование inject
, показанное выше.
Основной вопрос: известно ли это свойство и имеет имя и как оно связано с другими известными свойствами функторов (такими как аппликативные, монадические, заостренные, проходящие и т.д.)
Мотивация для названия "связующая" исходит из следующего рассмотрения: Предположим, что M является монадой, а F является "связующим" функтором. Тогда имеет место естественный морфизм:
fbind :: M a -> (a -> F(M b)) -> F(M b)
Это похоже на монадическое "связывание",
bind :: M a -> (a -> M b) -> M b
за исключением того, что результат украшен функтором F.
Идея fbind
заключалась в том, что обобщенная монадическая операция может приводить не только к одному результату M b, но и к "функторному" F таких результатов. Я хочу выразить ситуацию, когда монадическая операция дает несколько "нитей вычислений", а не только одну; каждая "цепочка вычислений" снова является монадическим вычислением.
Заметим, что каждый функтор F имеет морфизм
eject :: F(a -> b) -> a -> F b
который обращается к "инъекции" . Но не каждый функтор F имеет "инъекцию".
Примеры функторов, которые "вводят": F t = (t,t,t)
или F t = c -> (t,t)
, где c - постоянный тип. Функторы F t = c
(постоянный функтор) или F t = (c,t)
не являются "связуемыми" (т.е. Не имеют "инъекции" ). Функтор продолжения F t = (t -> r) -> r
также не имеет inject
.
Существование "инъекции" можно сформулировать по-другому. Рассмотрим "читательский" функтор R t = c -> t
, где c - постоянный тип. (Этот функтор является аппликативным и монадическим, но это не относится к точке.) Свойство "инъекции" означает R (F t) -> F (R t)
, другими словами, что R коммутирует с F. Заметим, что это не то же самое, что требование пересечения F; это было бы F (R t) -> R (F t)
, что всегда выполняется для любого функтора F относительно R.
До сих пор я мог показать, что "инъекция" подразумевает "fbind" для любой монады M.
Кроме того, я показал, что каждый функтор F, который имеет "инъекцию", также будет иметь следующие дополнительные свойства:
- он указан
point :: t -> F t
-
если F является "связующим" и аппликативным, тогда F также является монадой
-
если F и G являются "связываемыми", то и парный функтор F * G (но не F + G)
-
если F является "связующим" , а A - любым профинансором, то (pro) -функтор
G t = A t -> F t
является связующим -
тождественный функтор связывается.
Открытые вопросы:
-
является свойством быть "привязываемым", эквивалентным некоторым другим хорошо известным свойствам, или это новое свойство функтора, которое обычно не рассматривается?
-
существуют ли какие-либо другие свойства функтора "F", вытекающие из существования "инъекции" ?
-
Нужны ли нам какие-либо законы для "инъекций", это было бы полезно? Например, мы могли бы потребовать, чтобы R (F t) изоморфно F (R t) в одном или в обоих направлениях.