问题标签 [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 回答
384 浏览

monads - Comonad 的精辟总结。(其中 monad 是“不纯计算的类型”)

就简洁的摘要而言——这种对 Monads 的描述似乎更胜一筹——将它们描述为“用于不纯计算的类型”。

什么是comonad的等效简洁(一句话)描述?

0 投票
1 回答
301 浏览

monads - codata 的精辟总结(comonad 是“输入杂质的类型”)

就简洁的摘要而言——对 Comonads 的这种描述似乎更胜一筹——将它们描述为“输入杂质的类型”。

什么是 codata 的等效简洁(单句)描述?

0 投票
1 回答
394 浏览

haskell - cofree comonad 的可折叠实例

我试图找出unfold/coiterfromControl.Comonad.Cofreeunfold/anafrom之间的区别Data.Control.Fixedpoint。黑客库分别是。freerecursion-schemes

Cofree似乎是堂兄弟,Fix我试图弄清楚两者都有什么可能,只有其中一个有什么可能。

Foldable我可以写一个for的实例,Cofree这样我就可以申请cata一个从以下位置获得的免费 monad unfold/coiter

但我无法构造一个Unfoldable实例:

有可能吗?

0 投票
1 回答
2876 浏览

scala - 了解为什么 Zipper 是 Comonad

这是我上一个问题的答案的后续。

假设我需要将每个项目映射到a:A函数并生成。List[A]b:Bdef f(a:A, leftNeighbors:List[A]): BList[B]

显然我不能只调用map列表,但我可以使用列表拉链。拉链是在列表中移动的光标。它提供对当前元素 ( focus) 及其邻居的访问。

现在我可以替换 myf并将 def f'(z:Zipper[A]):B = f(z.focus, z.left)这个新函数传递f'cobind.Zipper[A]

像这样的cobind工作:它f'用拉链调用它,然后移动拉链,f'的“移动”拉链调用,再次移动拉链,依此类推......直到拉链到达列表的末尾。

最后,cobind返回一个新的 zipper 类型Zipper[B],可以转换为列表,这样问题就解决了。

现在注意和之间的对称性cobind[A](f:Zipper[A] => B):Zipper[B]bind[A](f:A => List[B]):List[B]这就是为什么List是 aMonadZipper是 a Comonad

是否有意义 ?

0 投票
1 回答
359 浏览

haskell - Comonads 是否适合为 Wumpus 世界建模?

我试图找到一些comonad的实际应用,我想我会尝试看看我是否可以将经典的Wumpus世界表示为comonad。

我想用这段代码让 Wumpus 在世界上左右移动,清理脏瓷砖,避免坑。似乎唯一有用的comonad函数是提取(获取当前图块),并且无法使用移动和清洁图块来使用扩展或复制。

我不确定comonads 是否合适,但我看过一个演讲(Dominic Orchard: A Notation for Comonads),其中comonads 用于在二维矩阵中对光标进行建模。

如果comonad 是代表Wumpus 世界的好方法,您能否说明我的代码哪里出错了?如果错了,你能建议一个简单的comonads应用吗?

谢谢!

0 投票
3 回答
847 浏览

haskell - “交错同态”的概念是真实的吗?

我需要以下类别的功能:

显然我为它发明的名字在任何方面都不是任何东西的官方术语,而且上面的类型类也不是很优雅。这是一个有名字的概念,甚至是某个库中的实现吗?有没有更合理的方法来做到这一点?


这个函数的目的是我有一些f注释一些数据的上下文(Foo并且Bar只是为了这个问题而随机的示例数据结构):

我想以多态的方式转换数据的上下文;通过只知道上下文之间的同态而不(必然)关心数据本身。这将通过在上面的示例中提供instance InterleavedHomomorphic Foo和来完成。instance InterleavedHomomorphic Bar

0 投票
2 回答
660 浏览

haskell - 将 state monad 与 costate comonad 结合

如何将 state monadS -> (A, S)与 costate comonad结合起来(E->A, E)

我尝试了两种明显的组合S -> ((E->A, E), S)(E->S->(A, S), E)但是在任何一种情况下,我都不知道如何为组合定义操作(return, extract, ... 等等)。

0 投票
2 回答
1211 浏览

haskell - 为什么 IO 是单子而不是共单子?

输出是一种有效的计算。因此,将其封装到 monad 中是有意义的。但是输入是上下文相关的计算。因此,将它封装成一个comonad 会更有意义。

但是在 Haskell 中,输入和输出都封装在IOmonad 中。为什么?

0 投票
1 回答
2178 浏览

haskell - 如何使二叉树拉链成为 Comonad 的实例?

我想让二叉树拉链成为comonad的实例,但我不知道如何duplicate正确实现。

这是我的尝试:

一些解释:

  • BinTree a是二叉树数据类型,每个树节点都包含一个标签。
  • Partial a是具有左子树或右子树的二叉树。我的代码中的一堆Partial a 扮演着数据上下文的角色。
  • BTZ代表BinTree拉链,我想创建一个实例Comonad,它由数据上下文和聚焦子树组成。

为了使其成为 的实例Comonad,我的计划是实现extractand duplicate,并通过采用一些随机二叉树来验证共单属性是否成立。

extract很简单,只需取出聚焦子树。

函数dup用作辅助函数,用专注于该节点的树拉链替换每个节点标签。

对于duplicate z,节点标签必须是z它自己才能extract . duplicate == id成立。对于非叶节点,我dup习惯于处理它们的子树,就好像它们没有父节点一样,然后将当前焦点z和数据上下文的其余部分附加到这些拉链上。

到目前为止,前两个comonad 属性已满足(extract . duplicate = idfmap extract . duplicate),但我不知道如何处理数据上下文。我目前所做的就是拉上拉链z并继续往上走。在此过程中,我们采用每个数据上下文堆栈的顶部来构建新的数据上下文堆栈,这听起来是正确的,而且是正确的类型 ( [Partial (BTZ a)]。但是我的方法不能满足第三定律。

给定上面二叉树拉链的数据类型定义,是否可以使其成为 Comonad 的实例?如果答案是肯定的,那么我的方法有问题吗?

0 投票
3 回答
6801 浏览

haskell - 拉链共胞,一般

给定任何容器类型,我们可以形成(以元素为中心的)拉链,并且知道这个结构是一个 Comonad。最近在另一个 Stack Overflow 问题中对以下类型进行了非常详细的探讨:

搭配以下拉链

虽然它的实例的构造有点毛茸茸,但情况确实Zip如此。Comonad也就是说,Zip可以完全机械地派生自Tree并且(我相信)以这种方式派生的任何类型都自动是 a Comonad,所以我认为我们应该可以通用和自动地构造这些类型及其comonads。

实现拉链构造通用性的一种方法是使用以下类和类型族

它(或多或少)出现在 Haskell Cafe 线程和 Conal Elliott 的博客中。此类可以针对各种核心代数类型进行实例化,从而为讨论 ADT 的导数提供了一个通用框架。

所以,最终,我的问题是我们是否可以写

可用于包含上述特定的 Comonad 实例:

不幸的是,我没有运气写出这样的例子。inTo/签名是否outOf足够?是否需要其他东西来限制类型?这种情况甚至可能吗?