2016-10-10 58 views
4

我过去几周一直在向一个将单子(主要是从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风格架构库是基础(每个箭头都有一个通用类,像ArrowStateArrowReader,等...),我试图找出这将是我的函数签名中ArrowStore,但再次,我不能。

我看了一下arrows包,它实现了我正在使用的库中的箭头,但它们的CoState箭头(我听说CoState是Store的另一个名称)没有定义任何操作,所以我猜测作者也有这个问题的麻烦。

TL;博士:

  • Monad m => Kleisli m a b相当于arrowized版本m
  • 对于Cokleisli箭头的连接器也是如此吗?
  • 如果是这样,我怎样才能将Store comonad表示为箭头?
  • 如果不是,我们甚至可以“箭头”连接器吗?
+1

总之:_yes,共同的Kleisli类别是你想要的。 – leftaroundabout

+0

@leftaroundabout:如果它是等价的,那么为什么'arrows'包的作者没有创建类型别名? (对于箭头变形金刚我想,但不知道) – baxbaxwalanuksiwe

+1

好的,请问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

回答

4

感谢leftaroundabout's comment,我发现Store comonad的“箭头”版本。

我的问题是,我无法找到我的箭头的“直接形式” - 正如左边提到的那样。但是,如果我要的是Cokleisli Store那么答案是简单的(不是很正式的格式,但你的想法):

newtype CokleisliT a w b c = CokleisliT { runCokleisliT :: a (w b) c } 
newtype Store s a = Store (s -> a, s) 

    Arrow a => CokleisliT a (Store s) b c 
<=> Arrow a => a (Store s b) c 
<=> Arrow a => a (s -> b, s) c 

从这里,我们可以推断出该ArrowStore类的签名:

class Arrow a => ArrowStore s a | a -> s where 
    pos :: a() s 
    peek :: a() b -> a s b 
    peeks :: a() b -> a (s -> s) b 
    seek :: a (s, b) c -> a b c 
    seeks :: a (s, b) c -> a (s -> s, b) c 

至于user's comment,显然箭头化一个(共)monad包装它在一个(共)Kleisli箭头。

下面是其他箭头的库:https://github.com/felko/atl