在过去的几周里,我一直在为一个将 monads(主要来自mtl)移植到 arrows的库做出贡献。
这是一个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) }
Run Code Online (Sandbox Code Playgroud)
对于大多数 monad 来说,“箭头化”过程并不是很痛苦,但我无法根据 Store comonad 找出我的箭头。
每次我问这个问题时,人们都会将我重定向到Cokleisli箭头,但将Cokleisli Store等同于我正在寻找的箭头?
该库基于一种mtl风格的体系结构(每个箭头都有一个通用类,如ArrowState、ArrowReader等...),我试图弄清楚我的函数在 中的签名是什么ArrowStore,但同样,我不能。
我查看了arrows实现与我正在研究的库中相同箭头的包,但是它们的CoState箭头(我听说 CoState 是 Store 的另一个名称)定义了没有操作,所以我猜作者也遇到了这个问题.
tl;博士: