在过去的几周里,我一直在为一个将 monads(主要从mtl
)移植到箭头的库做出贡献。
这是一个StateT
来自 monad的简单示例mtl
:
newtype StateT s m a = StateT { runStateT :: s -> m (a, s) }
-- arrowization -->
newtype StateTA s a b c = StateTA { runStateTA :: a (b, s) (c, s) }
对于大多数单子来说,“箭头化”过程并不是很痛苦,但我无法根据 Store 共单子找出我的箭头。
每次我问这个问题时,人们都会将我重定向到Cokleisli
箭头,但会Cokleisli Store
等同于我正在寻找的箭头吗?
该库基于mtl
-style 架构(每个箭头都有一个通用类,如ArrowState
,ArrowReader
等),我试图弄清楚我的函数在 中的签名是什么ArrowStore
,但我还是不能。
我查看了arrows
实现与我正在处理的库中相同的箭头的包,但是它们的CoState
箭头(我听说 CoState 是 Store 的另一个名称)没有定义任何操作,所以我猜作者也遇到了这个问题.
tl;博士:
- 是否
Monad m => Kleisli m a b
相当于箭头版本m
? Cokleisli
带有箭头的comonads也是如此吗?- 如果是这样,我怎样才能将
Store
comonad表示为箭头? - 如果没有,我们甚至可以“箭头化”comonads 吗?