ContT
monad变换器有一个有趣的属性:如果有* -> *
类型,例如Set
,它具有明确定义的monadic操作,但不能有Monad
实例由于某些约束(此处为Ord a
),可以将其包装在ContT
(ContT r Set
)中以获取monad实例,并推迟它之外的约束,就像我们将Set
注入ContT r Set
时一样。
请参阅Constructing efficient monad instances on Set
using the continuation monad。
箭头有类似的东西吗?一个arrow transformer,允许包裹一个"几乎箭头"进入它,获得一个有效的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
和这样的箭头变换器?