Есть ли что-то вроде продолжения Arrow в трансформаторе?
ContT
Монадный трансформатор обладает интересным свойством: если есть* -> *
типа, такого какSet
, который имеет четко определенные монадические операции, но не может иметь Monad
экземпляр из-за некоторых ограничений (здесь Ord a
), это можно обернуть ContT
(ContT r Set
) чтобы получить экземпляр монады, и отложить ограничения вне его, например, когда мы вводим Set
вContT r Set
, См. Построение эффективных экземпляров монады наSet
используя продолжение монады.
Есть ли что-то похожее на стрелки? Стрелочный трансформер, который позволил бы обернуть в него "почти стрелку", получив действительный Arrow
Например, и отложить проблемные ограничения в той части, где мы вводим в нее "почти стрелка"?
Например, если у нас был тип AlmostArrow :: * -> * -> *
для которого у нас было бы обычное Arrow
операции, но с ограничениями, такими как
arr' :: (Ord a, Ord b) => (a -> b) -> AlmostArrow a b
(>>>') :: (Ord a, Ord b, Ord c) => AlmostArrow a b -> AlmostArrow b c -> AlmostArrow a c
В качестве бонуса, если да, есть какой-нибудь изящный, общий способ теории категорий, как вывести оба ContT
а такой стрелочный трансформатор?