问题标签 [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.
monads - Comonad 的精辟总结。(其中 monad 是“不纯计算的类型”)
就简洁的摘要而言——这种对 Monads 的描述似乎更胜一筹——将它们描述为“用于不纯计算的类型”。
什么是comonad的等效简洁(一句话)描述?
monads - codata 的精辟总结(comonad 是“输入杂质的类型”)
就简洁的摘要而言——对 Comonads 的这种描述似乎更胜一筹——将它们描述为“输入杂质的类型”。
什么是 codata 的等效简洁(单句)描述?
haskell - cofree comonad 的可折叠实例
我试图找出unfold/coiter
fromControl.Comonad.Cofree
和unfold/ana
from之间的区别Data.Control.Fixedpoint
。黑客库分别是。free
和recursion-schemes
。
Cofree
似乎是堂兄弟,Fix
我试图弄清楚两者都有什么可能,只有其中一个有什么可能。
Foldable
我可以写一个for的实例,Cofree
这样我就可以申请cata
一个从以下位置获得的免费 monad unfold/coiter
:
但我无法构造一个Unfoldable
实例:
有可能吗?
scala - 了解为什么 Zipper 是 Comonad
这是我上一个问题的答案的后续。
假设我需要将每个项目映射到a:A
函数并生成。List[A]
b:B
def f(a:A, leftNeighbors:List[A]): B
List[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
是 aMonad
和Zipper
是 a Comonad
。
是否有意义 ?
haskell - Comonads 是否适合为 Wumpus 世界建模?
我试图找到一些comonad的实际应用,我想我会尝试看看我是否可以将经典的Wumpus世界表示为comonad。
我想用这段代码让 Wumpus 在世界上左右移动,清理脏瓷砖,避免坑。似乎唯一有用的comonad函数是提取(获取当前图块),并且无法使用移动和清洁图块来使用扩展或复制。
我不确定comonads 是否合适,但我看过一个演讲(Dominic Orchard: A Notation for Comonads),其中comonads 用于在二维矩阵中对光标进行建模。
如果comonad 是代表Wumpus 世界的好方法,您能否说明我的代码哪里出错了?如果错了,你能建议一个简单的comonads应用吗?
谢谢!
haskell - “交错同态”的概念是真实的吗?
我需要以下类别的功能:
显然我为它发明的名字在任何方面都不是任何东西的官方术语,而且上面的类型类也不是很优雅。这是一个有名字的概念,甚至是某个库中的实现吗?有没有更合理的方法来做到这一点?
这个函数的目的是我有一些f
注释一些数据的上下文(Foo
并且Bar
只是为了这个问题而随机的示例数据结构):
我想以多态的方式转换数据的上下文;通过只知道上下文之间的同态而不(必然)关心数据本身。这将通过在上面的示例中提供instance InterleavedHomomorphic Foo
和来完成。instance InterleavedHomomorphic Bar
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
, ... 等等)。
haskell - 为什么 IO 是单子而不是共单子?
输出是一种有效的计算。因此,将其封装到 monad 中是有意义的。但是输入是上下文相关的计算。因此,将它封装成一个comonad 会更有意义。
但是在 Haskell 中,输入和输出都封装在IO
monad 中。为什么?
haskell - 如何使二叉树拉链成为 Comonad 的实例?
我想让二叉树拉链成为comonad的实例,但我不知道如何duplicate
正确实现。
这是我的尝试:
一些解释:
BinTree a
是二叉树数据类型,每个树节点都包含一个标签。Partial a
是具有左子树或右子树的二叉树。我的代码中的一堆Partial a
扮演着数据上下文的角色。BTZ
代表BinTree
拉链,我想创建一个实例Comonad
,它由数据上下文和聚焦子树组成。
为了使其成为 的实例Comonad
,我的计划是实现extract
and duplicate
,并通过采用一些随机二叉树来验证共单属性是否成立。
这extract
很简单,只需取出聚焦子树。
函数dup
用作辅助函数,用专注于该节点的树拉链替换每个节点标签。
对于duplicate z
,节点标签必须是z
它自己才能extract . duplicate == id
成立。对于非叶节点,我dup
习惯于处理它们的子树,就好像它们没有父节点一样,然后将当前焦点z
和数据上下文的其余部分附加到这些拉链上。
到目前为止,前两个comonad 属性已满足(extract . duplicate = id
和fmap extract . duplicate
),但我不知道如何处理数据上下文。我目前所做的就是拉上拉链z
并继续往上走。在此过程中,我们采用每个数据上下文堆栈的顶部来构建新的数据上下文堆栈,这听起来是正确的,而且是正确的类型 ( [Partial (BTZ a)]
。但是我的方法不能满足第三定律。
给定上面二叉树拉链的数据类型定义,是否可以使其成为 Comonad 的实例?如果答案是肯定的,那么我的方法有问题吗?
haskell - 拉链共胞,一般
给定任何容器类型,我们可以形成(以元素为中心的)拉链,并且知道这个结构是一个 Comonad。最近在另一个 Stack Overflow 问题中对以下类型进行了非常详细的探讨:
搭配以下拉链
虽然它的实例的构造有点毛茸茸,但情况确实Zip
如此。Comonad
也就是说,Zip
可以完全机械地派生自Tree
并且(我相信)以这种方式派生的任何类型都自动是 a Comonad
,所以我认为我们应该可以通用和自动地构造这些类型及其comonads。
实现拉链构造通用性的一种方法是使用以下类和类型族
它(或多或少)出现在 Haskell Cafe 线程和 Conal Elliott 的博客中。此类可以针对各种核心代数类型进行实例化,从而为讨论 ADT 的导数提供了一个通用框架。
所以,最终,我的问题是我们是否可以写
可用于包含上述特定的 Comonad 实例:
不幸的是,我没有运气写出这样的例子。inTo
/签名是否outOf
足够?是否需要其他东西来限制类型?这种情况甚至可能吗?