问题标签 [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.
haskell - 创建 Comonad 实例有什么好处
在我的应用程序中,我正在尝试实现一个动画系统。在这个系统中,动画被表示为一个循环的帧列表:
我们可以(低效地)按如下方式推进动画:
现在,我很确定这个数据类型是一个comonad:
我的问题是:我从使用comonad 实例中获得了什么样的好处(如果有的话)?
haskell - Comonad 重复函数
为什么在定义函数时重复
对于 Comonad 类型类(链接),您必须“在上下文中”修改所有元素(即更改上下文当前值以外的元素)。为什么不在Monad 中使用类似return的东西?
示例(拉链):
为什么我不能将重复定义为
我试图从 Comonad 规则中得出对副本函数的要求,但我总是得到一个副本,它只是将元素包装起来,就像在 monad 中的return一样,不需要做任何其他事情。
一篇博文说:
重复有点难以掌握。从一个列表拉链,我们必须构建一个列表拉链的列表拉链。这背后的意义(由每个实例必须满足的共单定律证实)是在复制结构内移动返回原始结构,由相同的移动改变
但我不明白为什么一定是这样。Comonad规则中的fmap 总是适用于被包装的元素,然后这个元素总是用extract “解包”,除了包装duplicate的参数之外,为什么还要在duplicate函数中做其他事情呢?
你能指出我错过了什么吗?我觉得我在某个地方犯了一些明显的错误,但我自己无法弄清楚。
提前感谢您的回复!
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带回来:
haskell - 树函子和可折叠但带有节点。有什么概括吗?
我们可以创建 Functor 实例并使用
但是,如果我想要 (Tree t -> a) 而不是 (t -> a) 那么我可以访问整个 (Node t) 而不仅仅是 t
与折叠相同
对这些函数有什么概括吗?
haskell - 你能根据 `Monads` 定义 `Comonads` 吗?
好的,假设你有类型
事实证明,当f
是一个 Comonad 时,Dual f
就是一个 Monad(有趣的练习)。它是否可以反过来工作?
你可以定义fmap ab (Dual da) = Dual $ \fb -> da $ fmap (. ab) fb
and extract (Dual da) = da $ return id
,但我不知道如何定义duplicate
or extend
。
这甚至可能吗?如果不是,那么没有什么证明(是否有一个特定的 Monadm
可以证明Dual m
它不是共单子)?
一些观察:
Dual IO a
本质上是Void
(并且Const Void
是有效的Comonad
)。
Dual m a
对于MonadPlus m
是 Void
(只使用dual mzero
)。
Dual Reader
是Env
。
Dual Writer
是Traced
。
Dual State
是Store
,我认为。
haskell - Applicative 是 monad 就像 X 是 comonad
我们可以为 X 解这个方程吗?
Applicative 是 monad 就像 X 是 comonad
haskell - 合理的 Comonad 实现
我们可以将 monad 描述为计算上下文,并且 monad 的实现完全保留了该上下文的含义。例如 Option - 上下文含义是该值可能存在。给定 Option 数据类型,唯一有意义的实现是pure = some, flatMap f = {none => none; some x => f x }
根据我对 monad 的理解,遵循类型签名 - 对于任何 monad,只有一个合理的实现。换句话说,如果你想为值/计算添加一些有意义的上下文,对于任何特定的 monad 只有一种方法可以做到这一点。
另一方面,当谈到comonad 时,它突然开始感到完全陌生,好像有很多方法可以为给定类型实现comonad,你甚至可以为每个实现赋予一定的含义。
考虑一下,NEL,与copure = head
。 cojoin
是通过实现tails
的,完美满足了类型。如果我们cojoin
通过permutations
或因为fa map (_ => fa) map f
它不满足comonad 法则来实施。
但是循环实现是有效的:
Command 如此模棱两可的原因,即使有法律限制我们,正如我所见,如果在 Monad 我们在某些情况下限制自己(我们不能“创造”新信息),在 Comonad,我们是进一步扩展该上下文(有很多方法可以从列表中创建列表列表),这为我们提供了更多的可能性。在我的脑海中比喻是:对于 Monad,我们站在路上,想要达到一些目的地点 A = 因此只有有意义的最短路径可供选择。在命令中,我们站在 A 中,想从那里去某个地方,所以有更多的方法可以做到这一点。
所以我的问题是 - 我真的对吗?我们可以用不同的方式实现命令,每次都做另一个有意义的抽象吗?或者只是尾巴实施是合理的,因为 comonad 应该引入抽象。
haskell - 共同寻找所有关注网格的方法
首先是一些背景(哈哈)。我在非空列表上有一个拉链。
您可以沿着拉链向任一方向迈进,但您可能会从末端跌落。
复制拉链向您展示了您可以查看它的所有方式,重点是您当前查看它的方式。
例如:
(我使用大写和星号来表示拉链的焦点。)
我正在尝试使用具有焦点的二维网格,表示为拉链的拉链。每个内拉链都是一排格子。我的最终目标是通过从邻居跳到邻居来找到穿过网格的路径。
在网格中移动保持所有行都集中在同一个索引上的不变性。这使您可以轻松地专注于您的任何邻居。
例子:
我想要的是LZipper
's duplicate
for grids 的等价物:一个函数,它接受一个网格并生成一个网格,其中包含您可以查看网格的所有方式,重点是您当前查看它的方式。
我所期待的:
我试过了duplicateGrid = duplicate . duplicate
。这具有正确的类型,但是(假设我show
正确地解释了输出,我可能没有)它只给了我集中在第一列某处的网格:
我也试过了duplicateGrid = duplicate . fmap duplicate
。再次假设我能够解释show
输出,这给了我一些包含错误网格并且行的焦点未对齐的东西,这样向下移动也会让你继续前进:
对于那些知道的人来说,这感觉像是一个简单的问题,但它让我头晕目眩。我想我可以手动启动一个调用up
,和的函数down
,但我觉得 comonadic 机器应该能够为我做这件事。什么是正确的实现?left
right
duplicateGrid