问题标签 [arrows]

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 回答
2756 浏览

haskell - ArrowLoop 是如何工作的?另外,mfix?

我现在对其余的箭头机械相当满意,但我不明白循环是如何工作的。这对我来说似乎很神奇,这对我的理解不利。我也很难理解 mfix。当我查看在reca procordo块中使用的一段代码时,我会感到困惑。使用常规的 monadic 或箭头代码,我可以逐步完成计算并在脑海中保持对正在发生的事情的操作画面。当我到达时rec,我不知道要保留什么图片!我被卡住了,我无法推理这样的代码。

我试图理解的例子来自罗斯帕特森关于箭头的论文,关于电路的论文。

我假设如果我理解了这个例子,我将能够理解循环,这将有助于理解 mfix。他们对我的感觉基本相同,但也许我错过了一个微妙之处?无论如何,我真正想要的是这些代码片段的操作图,所以我可以像“常规”代码一样在脑海中逐步浏览它们。

编辑:感谢Pigworker的回答,我开始考虑rec之类的要求得到满足。举counter个例子,rec 块的第一行需要一个名为 的值output。我想象这在操作上是创建一个盒子,给它贴标签output,然后让 rec 块填充那个盒子。为了填充该框,我们向 returnA 输入一个值,但该值本身需要另一个值,称为next. 为了使用这个值,必须在 rec 块中要求另一行,但现在在 rec 块中的哪个位置要求它并不重要

所以我们转到下一行,找到标有 的框next,我们要求另一个计算填充它。现在,这个计算需要我们的第一个盒子!所以我们给它 box,但它里面没有任何值,所以如果这个计算需要 的内容output,我们就会进入一个无限循环。幸运的是,延迟获取了盒子,但在不查看盒子内部的情况下产生了一个值。这填充next,然后允许我们填充output。现在output已填充,当处理该电路的下一个输入时,前一个output框将具有其值,准备好被要求以产生下一个next,从而产生下一个output

听起来怎么样?

0 投票
2 回答
1065 浏览

haskell - “介于”类别和箭头之间的类型类有意义吗?

通常你有类似 an Applicativewithoutpure或类似 a Monad, but without的东西return。semigroupoid包用和覆盖了这些情况。现在我处于类似的情况,我无法定义一个有意义的函数,但我认为其他函数会很有意义。ApplyBindArrowarr

我定义了一个包含函数的类型,它是反向函数:

现在我无法实现Arrow,但更弱一些:

我认为我无法实现 , 的等价物&&&,因为它被定义为f &&& g = arr (\b -> (b,b)) >>> f *** g,并且(\b -> (b,b))不可逆。不过,您认为这个较弱的类型类可能有用吗?从理论的角度来看,它甚至有意义吗?

0 投票
1 回答
476 浏览

opengl - 在箭头内调用 IO Monad

也许我的做法是错误的,但我正在使用 HXT 读取一些我想在 HOpenGL 的数组中使用的顶点数据。顶点数组需要是通过调用 newArray 创建的 Ptr。不幸的是 newArray 返回一个 IO Ptr,所以我不确定如何在 Arrow 中使用它。我想我需要一个类型声明类似于 IO a -> Arrow a 的东西?

0 投票
1 回答
445 浏览

haskell - 如何将参数传递给HXT箭头以及如何使用-<<

我的问题如下。我有这个 xml 文件要解析:

我想有以下输出:

但是下面的代码给了我:

我只想解析一次 XML 以检索“错误标签”和 ERR。

我认为我的问题出在功能上errToLab,但没有明显的解决方案。

谢谢你的帮助。

这是代码

0 投票
1 回答
468 浏览

haskell - 如何混合应用函子和箭头

我在 Andrew Birkett 的博客Applicative arrows for XML &&& return to pure上读到,我们可以混合使用箭头和应用函子。

我自己尝试过,但我没有我所期望的。我想要这个结果:

但我得到了这个:

我认为我的代码中有一个转折,但我不知道在哪里搜索。

如果有人可以提出一些帮助,下面是我的代码。

0 投票
1 回答
153 浏览

haskell - 如何处理嵌套记录和 listA 箭头

我有以下情况。我从探针中获得周数据。数据收集在几个 xml 文件中(在下面的代码中内联)。我需要将它们合并到一个文件中。虽然我将它们汇总在一个记录中,可以进一步翻译成一个文件。

我试图捕捉的结果记录如下:

如您所见,perfM收集所有数据。

但是下面的代码给了我。

我真的不清楚这里发生了什么以及我应该在哪里看。我认为它在 getYearOri 和 addOri 函数中,但到目前为止我所有的尝试都失败了。

如果有人可以给我一个关于要更改的代码的线索。

0 投票
3 回答
380 浏览

list - 用箭头比较列表长度

灵感来自比较列表长度

如果我想在列表列表中找到最长的列表,最简单的方法可能是:

一种更有效的方法是预先计算长度:

现在,我想更进一步。对于正常情况,它可能效率不高,但你能用箭头解决这个问题吗?我的想法基本上是,同时遍历所有列表,并继续步进,直到超过除最长列表之外的每个列表的长度。

在前面的(非常人为的)示例中,您只需通过每个列表采取两个步骤,以确定该列表[1..2^1000]是最长的,而无需确定所述列表的整个长度。我可以用箭头来完成吗?如果是这样,那怎么办?如果不是,那为什么不呢?如何实施这种方法?

0 投票
3 回答
1860 浏览

haskell - 在实践中使用单子、幺半群、函子和箭头

我最近遇到了这篇关于函数式编程不同方面的有用资源的帖子,例如 monads 和 monoids 等。

但问题是——普通程序员可以从这些概念中得到什么用处。我经常遇到关于这些问题的“学术”研究。但是,我在实践中(在实际项目中)从未遇到过使用它们的人。

所以问题是 - Haskell 中是否有任何广泛使用的开源项目真正利用了这些东西,这些项目证明了这个概念在“生产”软件中的实际必要性,而不是在编写的“学术”软件中”纯娱乐”。制作这样的列表会很酷:

  • Monads - 用于 A 和 B 等项目,否则这样的代码看起来会复杂得多。
  • 对幺半群也是如此。
  • 函子也是如此。
  • 箭也是一样。
0 投票
1 回答
2092 浏览

haskell - Arrow 和 Monad,两个独立的观点来组成计算?

我在Monad.Reader#13中阅读了 Brent Yorgey 的“The Typeclassopedia” ,发现“Functor hierachy”与“the Category hierachy”相互依赖,如图 1 所示。

图1

而且根据作者的说法ArrowApply == Monad,特别是前面那个只是一个类型类实例,可以在什么时候使用

“我们希望能够从中间结果计算出一个箭头,并使用这个计算出的箭头继续计算。这是 ArrowApply 赋予我们的能力。”

但是我们怎样才能把这些东西放在一起呢?我的意思是 Monad 和 Arrow 中都有一些流控制功能(like ifand elsevs.ArrowChoiceforMvs. ArrowLoop),而 Monad 中的某些功能似乎“缺失”了((***)(|||)first。所有这些似乎我们需要在使用 Monad 或 Arrow 系统来构建我们的副作用计算流程之间做出选择,并且会在另一个系统中丢失一些特性。

0 投票
1 回答
1040 浏览

haskell - 有没有可以像自动机一样使用的单子?

我正在编写从某种输入数据类型到输出数据类型的流转换器。输入由用户进行,因此事件之间有一些时间。因为每个输入都需要一些资源加载,所以我想“展望未来”,即将所有可能的输入发送到主计算并根据结果预加载资源。

目前,每次输入之后总是只有一个输出,但改变它最终可能会变得有趣。

我用 Ross Paterson 的 Automaton 变压器成功地实现了这一点。我不确定我的解决方案是否最佳。

  • 有没有很好的例子如何做到这一点?也许甚至有测试代码?
  • 它也可以用单子来实现吗?(例子?,解释为什么不可能?)

编辑:在调用更多细节之后,我在这里添加了代码。现在我要删除它(这是无法理解的)并添加一些其他解释。我的问题得到了回答。

我的意图是在每个用户输入被馈送到箭头/流转换器/任何东西之后停止主事件循环。然后它将存储当前的自动机状态并将所有可能的输入(假事件)一一发送给自动机,并查看必须加载哪些资源,以缓存它们。在下一个真实事件之后,它将使用缓存以获得更好的响应。主计算不应受此影响。