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

haskell - 如何使用带有 Cofree 注释的 AST?

我有这个简单的ExprAST,我可以轻松地将其转换为String.

现在我想向它添加一个额外的数据。所以我正在尝试使用Cofree

我可以转换ExprExpr2

但我不知道如何转换Expr2String

另外,Cofree 是解决这个注释问题的最好方法吗?

0 投票
1 回答
4979 浏览

haskell - Haskell 中的 Cofree CoMonad 有哪些激励示例?

我一直在玩Cofree,并不能完全了解它。

例如,我想Cofree [] Num在 ghci 中玩,却找不到任何有趣的例子。

例如,如果我构造一个 Cofree 类型:

我希望extract a == 1,但我得到了这个错误:

和一种:

我能得到一些简单的例子,即使是微不足道的,关于如何使用 Cofree 和仿函数:[], or Maybe, or Either, 演示

  • extract
  • extend
  • unwrap
  • duplicate?

交叉发布:https ://www.reddit.com/r/haskell/comments/4wlw70/what_are_some_motivating_examples_for_cofree/

编辑:在 David Young 的评论的指导下,这里有一些更好的例子,说明我的第一次尝试被误导了,但是我仍然喜欢一些可以引导 Cofree 直觉的例子:

0 投票
1 回答
233 浏览

haskell - 箭头化商店comonad

在过去的几周里,我一直在为一个将 monads(主要从mtl)移植到箭头的库做出贡献。

这是一个StateT来自 monad的简单示例mtl

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

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

该库基于mtl-style 架构(每个箭头都有一个通用类,如ArrowState,ArrowReader等),我试图弄清楚我的函数在 中的签名是什么ArrowStore,但我还是不能。

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

tl;博士:

  • 是否Monad m => Kleisli m a b相当于箭头版本m
  • Cokleisli带有箭头的comonads也是如此吗?
  • 如果是这样,我怎样才能将Storecomonad表示为箭头?
  • 如果没有,我们甚至可以“箭头化”comonads 吗?
0 投票
1 回答
256 浏览

haskell - 双胞胎的方法是什么?

在思考什么更有用的标准类建议给这个

我突然想到,这里可能潜伏着一个更普遍的野兽,而不是VectorSpace-y or R2:a Type -> Type -> Type,它的两个包含的类型都可以被提取。嗯,也许他们可以被extract教育

原来comonadnorbifunctors包都不包含名为Bicomonad. 问题是,从理论上讲,这样的课程是否有意义?不像Bimonad(它也没有定义,我真的看不出它看起来如何),一个天真的定义似乎是合理的:

可能与法律有关

但是我发现令人不安的是,结果的两个字段都bidup包含相同的类型,并且还有很多其他的,也许是“更好”的可以想象的签名。

有什么想法吗?

0 投票
1 回答
164 浏览

haskell - 有没有一种通用的方法可以将失败单子上的自由共单子分解为“值流和最终错误”?

comonadCofree对于以错误类型的多态方式迭代部分函数很有用。它coiter类似于forM错误单子中的循环,但它以纯/惰性方式收集生成的值,并且您只会在数据结构的末尾看到错误。

例如,Cofree Identity(no failure allowed!) 是一个无限流,而与 ,Cofree Maybe同构NonEmpty,并且Cofree (Either e) a基本上是(NonEmpty a, e)(成功迭代值的列表加上最后发生的错误)。

现在我想知道评估结果的最佳方法是什么,而不需要对单个错误单子进行特定的模式匹配。由于实例(例如),提取所有非常容易,但我不确定如何最好地掌握错误。可以利用它来摆脱这些值并留下错误部分:FoldabletoListFoldable

但这感觉有点骇人听闻。有更好的解决方案吗?

0 投票
0 回答
103 浏览

haskell - Functor 的共点上的自然单曲面结构是否会诱导 Comonad?

情况如下(我改为更标准的 Haskell 表示法):

使得对于所有的实例 FMonoidallyCopointed并且对于所有

以下成立:

那么 F 有一个从和Comonad定义的自然实例是真的吗?copointAppendcopointEmpty

NB 反过来成立 (with copointEmpty = extractand copointAppend f g = f . g . duplicate.)

编辑

正如 Bartosz 在评论中指出的那样,这主要是使用 co-Kleisli 附加词来定义共胞。所以问题实际上是关于这个概念的建设性。因此,就实际应用而言,以下问题可能更有趣:

Comonadf 的可能实例集和 f 的可能实例集之间是否存在建设性同构MonoidallyCopointed

这在实践中很有用,因为Comonad实例的直接定义可能涉及一些技术性的、难以阅读的代码,这些代码无法通过类型检查器进行验证。例如,

有一个 Comonad 实例,但直接定义(证明它确实是一个 Comonad!)可能并不那么容易。另一方面,提供一个MonoidallyCopointed实例可能会更容易一些(但我并不完全确定这一点)。

0 投票
1 回答
130 浏览

haskell - 作家单子和无序

我正在使用Writermonad 来跟踪任意值(例如Int)上的错误(“冲突”)标志。一旦设置了标志,它就是“粘性的”,并将其自身附加到作为标记的任何操作的结果产生的所有值上。

有时碰撞标志与单个值相关联,有时我想与组合结构(例如列表)相关联。当然,一旦为整个列表设置了冲突标志,假设它是为单个元素设置的也是有意义的。因此,对于 writer monad m,我需要以下两个操作:

第一个在 Prelude 中定义,而第二个必须定义。是关于如何使用comonads定义它的一个很好的讨论。本机comonad 实现不保留状态。这是一个例子:

产生正确的ex1值,而ex2输出不正确地不保留碰撞标志:

鉴于此,我有两个问题:

  1. 是否可以unsequence使用不特定于 monadic 和 comonadic 运算符来定义Writer
  2. 上面的函数是否有更优雅的实现extend,可能类似于这个

谢谢!

0 投票
2 回答
234 浏览

haskell - 哪种代数模式适合这种类型的树?

我有一个谜题给你

我设法编写了一些代码来使用递归方案来完成这些事情,但它非常混乱,这通常意味着我在某个地方错过了一个有用的抽象。

我正在为我的文本编辑器设计一个布局系统 Rasa;它以与 Vim 非常相似的方式使用拆分。我决定用树来描述分裂;您可以将其想象为在叶节点处带有“视图”的垂直或水平拆分的二叉树。这张照片 可能会有所帮助。

这是我的初始数据结构:

我需要的一些操作是:

  • split :: (View -> Tree View) -> Tree View -> Tree View 将节点(或不)拆分为水平或垂直的两个节点(同时保持它们在树中的位置)
  • close :: (View -> Bool) -> Tree View -> Tree View它通过从树中删除它们并正确重新组织相邻视图来“关闭”任何与谓词匹配的视图。
  • fmap; 我希望树成为函子,这样我就可以改变视图。

一些不错的功能: - focusRight :: Tree View -> Tree View,当且仅当左侧最近的水平连接视图处于活动状态时,才将视图设置为活动状态

我正在寻找一种抽象或一组抽象,它们将以一种干净的方式提供此功能。到目前为止,这是我的思考过程:

起初我以为我有一个 Monoid,身份是空树,并且 mappend只会将另一个分支附加到树上,但这不起作用,因为我有两个操作:垂直追加和水平追加,并且这些操作不是关联的当它们混合在一起时。

接下来我想“我的一些操作取决于他们的上下文”,所以我可能有一个 Comonad。我拥有的树的版本不能作为共同单子工作,因为我extract在分支上没有价值,所以我像这样重组了我的树:

但这仍然没有处理根据其中的内容“拆分”节点的情况,这与签名相匹配,它与Monad(View -> Tree View) -> Tree View -> Tree View统一,所以也许我有一个 monad?bind我可以为原始 Tree 定义实现 monad,但无法为我的 Comonad 树版本弄清楚。

有没有办法让我在这里两全其美?我用 Comonad/Monad 挖错树了吗?基本上,我正在寻找一种优雅的方法来对我的数据结构上的这些函数进行建模。谢谢!

如果你想查看完整的代码,函数在这里,当前树在这里

0 投票
3 回答
244 浏览

haskell - 就 Monad 的自然变换而言,Haskell 的 (<-)

所以我正在玩 GHCi 中的 hasbolt 模块,我对一些脱糖感到好奇。我一直通过如下创建管道连接到 Neo4j 数据库

这很好用。但是,我想知道(<-)运算符的类型是什么(GHCi 不会告诉我)。大多数脱糖的解释描述了

脱糖

但是只有这条线呢x <- a?添加它对我没有帮助,return因为我不想pipe :: Pipepipe :: Control.Monad.IO.Class.MonadIO m => m Pipe但是如果没有它,(>>=) :: Monad m => m a -> (a -> m b) -> m b尝试使用bindand return/来脱糖pure是行不通的。

理想情况下,似乎最好只创建一个Comonad实例以启用extract :: Monad m => m a -> aaspipe = extract $ connect $ def {creds}但它让我不明白(<-)

另一个奇怪的是,(<-)作为haskell函数,它的第一个参数是一个超出范围的变量,但这并不意味着

因为不仅仅是任何东西都可以用作自由变量。例如,您不能将管道绑定到Num类型或Bool. 变量必须是一个“字符串”的东西,除非它实际上不是一个String; 而且您绝对不能尝试实际绑定到String. 所以它似乎不是通常意义上的haskell函数(除非有一类函数从自由变量命名空间中获取值......不太可能)。那么究竟是(<-)什么?可以用 using 完全替换extract吗?这是脱糖/规避它的最佳方法吗?

0 投票
1 回答
271 浏览

haskell - 使用 Comonad 修复组合器

所以我最近一直在试验定点,终于通过常规的定点挣扎,足以发现一些用途;现在我正在转向comonadic固定点,我担心我被卡住了;

以下是我尝试过的和无效/无效的一些示例:

所以我从勒布定理开始。列表的每个元素都是一个函数,它采用最终结果来计算其答案;这让我可以进行“电子表格”计算,其中值可以依赖于其他值。

好的,所以我有基本的修复工作,是时候继续使用comonad类型了!这里有一些简单的comonads用于示例:

好的,以下组合子来自Control.Comonad

我开始尝试 wfix:

在这种情况下,这似乎通过w a -> a在 w 上调用第一个直到达到解决方案来工作const 0;这就说得通了。我们也可以用磁带做到这一点:

K,我想我得到了那个,但是下一个我有点卡住了,我似乎对 cfix 应该做什么没有直觉。当我评估它时,即使是我能想到的最简单的事情也会永远旋转。即使尝试使用 getOne 提取流的第一个元素也会失败。

与 kfix 类似;即使是简单的尝试似乎也不会终止。我对 kfix 的理解是,每个“槽”中的函数都传递了一个被评估的comonad 的副本,该副本集中在那个位置;是这样吗?

我尝试对此使用“getOne”:

这是使用磁带的有限尝试,但也无法运行:

所以; 归结为我的问题,有人可以提供一些使用 cfix 和 kfix 的可运行(非平凡)示例,并解释它们是如何工作的吗?我计划使用 kfix 最终进行“康威的生活游戏”风格实验,我认为 kfix 在与给定单元周围的社区合作时是否有用?

随时提出任何澄清性问题,并帮助我扩展我的知识和修复直觉!

谢谢!