gpt4 book ai didi

haskell - 将 Store comonad 箭头化

转载 作者:行者123 更新时间:2023-12-02 16:24:56 26 4
gpt4 key购买 nike

过去几周我一直在为一个将 monad(主要来自 mtl)移植到 arrows 的库做出贡献。

这是一个来自 mtlStateT monad 的简单示例:

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) }

对于大多数 monad 来说,“箭头化”过程并不是很痛苦,但我无法根据 Store comonad 找出我的箭头。

每次我问这个问题时,人们都会将我重定向到 Cokleisli 箭头,但是 Cokleisli Store 是否等同于我正在寻找的箭头?

该库基于 mtl 风格的架构(每个箭头都有一个通用类,如 ArrowStateArrowReader 等。 .),我试图找出 ArrowStore 中我的函数的签名是什么,但我还是不能。

我查看了 arrows 包,它实现了与我正在开发的库中相同的箭头,但是它们的 CoState 箭头(我听说 CoState 是另一个Store 的名称)没有定义任何操作,所以我猜作者也遇到了这个问题。

tl;博士:

  • Monad m => Kleisli m a b 等价于箭头版本 m 吗?
  • 对于带有 Cokleisli 箭头的 comonads 也是如此吗?
  • 如果是这样,我如何将 Store comonad 表示为箭头?
  • 如果没有,我们甚至可以“箭头化”comonad 吗?

最佳答案

感谢leftaroundabout's comment ,我找到了 Store comonad 的“箭头”版本。

我的问题是我找不到我的箭头的“直接形式”——正如 leftaroundabout 提到的那样。但是,如果我想要的是 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 ,显然箭头化(co)monad 将其包裹在(co)Kleisli 箭头中。

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

关于haskell - 将 Store comonad 箭头化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39961774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com