我过去几周一直在向一个将单子(主要是从mtl
)转移到箭头的图书馆捐款。Arrowization the store comonad
下面是与StateT
单子一个简单的例子,从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) }
的“arrowizing”的方法并不适用于大多数的单子真的很痛苦,但是基于我想不出我的箭存储comonad。
每次我问这个问题时,人们会将我重定向到Cokleisli
箭头,但Cokleisli Store
会等同于我正在查找的箭头吗?
在mtl
风格架构库是基础(每个箭头都有一个通用类,像ArrowState
,ArrowReader
,等...),我试图找出这将是我的函数签名中ArrowStore
,但再次,我不能。
我看了一下arrows
包,它实现了我正在使用的库中的箭头,但它们的CoState
箭头(我听说CoState是Store的另一个名称)没有定义任何操作,所以我猜测作者也有这个问题的麻烦。
TL;博士:
- 是
Monad m => Kleisli m a b
相当于arrowized版本m
? - 对于
Cokleisli
箭头的连接器也是如此吗? - 如果是这样,我怎样才能将
Store
comonad表示为箭头? - 如果不是,我们甚至可以“箭头”连接器吗?
总之:_yes,共同的Kleisli类别是你想要的。 – leftaroundabout
@leftaroundabout:如果它是等价的,那么为什么'arrows'包的作者没有创建类型别名? (对于箭头变形金刚我想,但不知道) – baxbaxwalanuksiwe
好的,请问Ross Paterson ......我不知道“箭头”套装的具体动机,但我认为这非常有趣,请看这些特殊的Kleisli箭头的外观以“直接形式”,因此希望不只是新型克莱斯利。不过,我认为['CoStateArrow'](http://hackage.haskell.org/package/arrows-0.4.4。1/docs/Control-Arrow-Transformer-CoState.html)实际上并不完全正确 - 这是一个用一个** Hask **替换一个基本箭头的咖喱形式。我认为它应该是'a(s-> b,s)c'。甚至实际上是'a(a s b,c)'。 – leftaroundabout