问题标签 [comonad]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
319 浏览

haskell - 创建 Comonad 实例有什么好处

在我的应用程序中,我正在尝试实现一个动画系统。在这个系统中,动画被表示为一个循环的帧列表:

我们可以(低效地)按如下方式推进动画:

现在,我很确定这个数据类型是一个comonad:

我的问题是:我从使用comonad 实例中获得了什么样的好处(如果有的话)?

0 投票
1 回答
514 浏览

haskell - Comonad 重复函数

为什么在定义函数时重复

对于 Comonad 类型类(链接),您必须“在上下文中”修改所有元素(即更改上下文当前值以外的元素)。为什么不在Monad 中使用类似return的东西?

示例(拉链):

为什么我不能将重复定义为

我试图从 Comonad 规则中得出对副本函数的要求,但我总是得到一个副本,它只是将元素包装起来,就像在 monad 中的return一样,不需要做任何其他事情。

一篇博文说:

重复有点难以掌握。从一个列表拉链,我们必须构建一个列表拉链的列表拉链。这背后的意义(由每个实例必须满足的共单定律证实)是在复制结构内移动返回原始结构,由相同的移动改变

但我不明白为什么一定是这样。Comonad规则中的fmap 总是适用于被包装的元素,然后这个元素总是用extract “解包”,除了包装duplicate的参数之外,为什么还要在duplicate函数中做其他事情呢?

你能指出我错过了什么吗?我觉得我在某个地方犯了一些明显的错误,但我自己无法弄清楚。

提前感谢您的回复!

0 投票
2 回答
297 浏览

haskell - 在 2 维中打结

编辑:U2Graph最初的问题是“与comonad 打结”,但这里真正有帮助的是与来自cirdec打结的二维结。原始问题(直到 Anwser):

我想用来自comonad的数据打结

更丰富的数据结构

有一个功能

但是,当我尝试填写 for 时,我的大脑会遇到“发生检查” undefined

我无法解决的问题是,我需要参考我正在构建的东西,它被深深地埋在了一个comonad中。我想确定圆圈实际上指向同一个重击。

解决它的最佳方法是什么?那是comonad要走U a的路吗?双向链表data T a = T (Maybe (T a)) a (Maybe (T a))似乎遇到了同样的问题,但将更难扩展到二维。


背景:我尝试在haskell中实现codegolf的老鼠赛跑。因此,由于计算耗时,我想通过 tying-the-know 引用相同的 thunk。

回答

解决方案来自Cirdec 的 Answer。它只是错过了我不想发表评论的一小步。

导致我的大脑遇到“发生检查”的原因是:要构建 aFullCell并在其领域打结,move我需要已经构建的U2Graph FullCell. 既然我已经说过了,这个要求很容易写成:

其中第一个参数是构造 my 的函数FullCell。Cirdec 的功能可以轻松调整。最后一步是将comonad带回来:

0 投票
1 回答
263 浏览

haskell - 树函子和可折叠但带有节点。有什么概括吗?

我们可以创建 Functor 实例并使用

但是,如果我想要 (Tree t -> a) 而不是 (t -> a) 那么我可以访问整个 (Node t) 而不仅仅是 t

与折叠相同

对这些函数有什么概括吗?

0 投票
1 回答
271 浏览

haskell - 每个免费的单子都超过 ??? 函子产生一个comonad?

这个对“单子可以是共单子吗?”的回答中 我们看到

每个替代函子上的Cofree Comonad都会产生一个 Monad。

什么是双重的?是否有一类函子可以自动使自由单子成为共单子?

0 投票
1 回答
630 浏览

haskell - 你能根据 `Monads` 定义 `Comonads` 吗?

好的,假设你有类型

事实证明,当f是一个 Comonad 时,Dual f就是一个 Monad(有趣的练习)。它是否可以反过来工作?

你可以定义fmap ab (Dual da) = Dual $ \fb -> da $ fmap (. ab) fband extract (Dual da) = da $ return id,但我不知道如何定义duplicateor extend

这甚至可能吗?如果不是,那么没有什么证明(是否有一个特定的 Monadm可以证明Dual m它不是共单子)?

一些观察: Dual IO a本质上是Void(并且Const Void是有效的Comonad)。 Dual m a对于MonadPlus m Void(只使用dual mzero)。 Dual ReaderEnvDual WriterTracedDual StateStore,我认为。

0 投票
2 回答
1027 浏览

haskell - Applicative 是 monad 就像 X 是 comonad

我们可以为 X 解这个方程吗?

Applicative 是 monad 就像 X 是 comonad

0 投票
2 回答
701 浏览

haskell - 合理的 Comonad 实现

我们可以将 monad 描述为计算上下文,并且 monad 的实现完全保留了该上下文的含义。例如 Option - 上下文含义是该值可能存在。给定 Option 数据类型,唯一有意义的实现是pure = some, flatMap f = {none => none; some x => f x } 根据我对 monad 的理解,遵循类型签名 - 对于任何 monad,只有一个合理的实现。换句话说,如果你想为值/计算添加一些有意义的上下文,对于任何特定的 monad 只有一种方法可以做到这一点。
另一方面,当谈到comonad 时,它突然开始感到完全陌生,好像有很多方法可以为给定类型实现comonad,你甚至可以为每个实现赋予一定的含义。
考虑一下,NEL,与copure = headcojoin是通过实现tails的,完美满足了类型。如果我们cojoin通过permutations或因为fa map (_ => fa) map f它不满足comonad 法则来实施。
但是循环实现是有效的:

Command 如此模棱两可的原因,即使有法律限制我们,正如我所见,如果在 Monad 我们在某些情况下限制自己(我们不能“创造”新信息),在 Comonad,我们是进一步扩展该上下文(有很多方法可以从列表中创建列表列表),这为我们提供了更多的可能性。在我的脑海中比喻是:对于 Monad,我们站在路上,想要达到一些目的地点 A = 因此只有有意义的最短路径可供选择。在命令中,我们站在 A 中,想从那里去某个地方,所以有更多的方法可以做到这一点。
所以我的问题是 - 我真的对吗?我们可以用不同的方式实现命令,每次都做另一个有意义的抽象吗?或者只是尾巴实施是合理的,因为 comonad 应该引入抽象。

0 投票
3 回答
607 浏览

haskell - 共同寻找所有关注网格的方法

首先是一些背景(哈哈)。我在非空列表上有一个拉链。

您可以沿着拉链向任一方向迈进,但您可能会从末端跌落。

复制拉链向您展示了您可以查看它的所有方式,重点是您当前查看它的方式。

例如:

(我使用大写和星号来表示拉链的焦点。)


我正在尝试使用具有焦点的二维网格,表示为拉链的拉链。每个内拉链都是一排格子。我的最终目标是通过从邻居跳到邻居来找到穿过网格的路径。

在网格中移动保持所有行都集中在同一个索引上的不变性。这使您可以轻松地专注于您的任何邻居。

例子:

我想要的是LZipper's duplicatefor grids 的等价物:一个函数,它接受一个网格并生成一个网格,其中包含您可以查看网格的所有方式,重点是您当前查看它的方式。

我所期待的:

我试过了duplicateGrid = duplicate . duplicate。这具有正确的类型,但是(假设我show正确地解释了输出,我可能没有)它只给了我集中在第一列某处的网格:

我也试过了duplicateGrid = duplicate . fmap duplicate。再次假设我能够解释show输出,这给了我一些包含错误网格并且行的焦点未对齐的东西,这样向下移动也会让你继续前进:

对于那些知道的人来说,这感觉像是一个简单的问题,但它让我头晕目眩。我想我可以手动启动一个调用up,和的函数down,但我觉得 comonadic 机器应该能够为我做这件事。什么是正确的实现?leftrightduplicateGrid

0 投票
1 回答
239 浏览

list - 列表是单子和共子吗?

列表单子在这里给出。另请参阅此处的 Spivak论文。所以 list 是一个单子。是共生体吗?你将如何证明这一点?