问题标签 [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.
haskell - ArrowLoop 是如何工作的?另外,mfix?
我现在对其余的箭头机械相当满意,但我不明白循环是如何工作的。这对我来说似乎很神奇,这对我的理解不利。我也很难理解 mfix。当我查看在rec
a proc
ordo
块中使用的一段代码时,我会感到困惑。使用常规的 monadic 或箭头代码,我可以逐步完成计算并在脑海中保持对正在发生的事情的操作画面。当我到达时rec
,我不知道要保留什么图片!我被卡住了,我无法推理这样的代码。
我试图理解的例子来自罗斯帕特森关于箭头的论文,关于电路的论文。
我假设如果我理解了这个例子,我将能够理解循环,这将有助于理解 mfix。他们对我的感觉基本相同,但也许我错过了一个微妙之处?无论如何,我真正想要的是这些代码片段的操作图,所以我可以像“常规”代码一样在脑海中逐步浏览它们。
编辑:感谢Pigworker的回答,我开始考虑rec之类的要求得到满足。举counter
个例子,rec 块的第一行需要一个名为 的值output
。我想象这在操作上是创建一个盒子,给它贴标签output
,然后让 rec 块填充那个盒子。为了填充该框,我们向 returnA 输入一个值,但该值本身需要另一个值,称为next
. 为了使用这个值,必须在 rec 块中要求另一行,但现在在 rec 块中的哪个位置要求它并不重要。
所以我们转到下一行,找到标有 的框next
,我们要求另一个计算填充它。现在,这个计算需要我们的第一个盒子!所以我们给它 box,但它里面没有任何值,所以如果这个计算需要 的内容output
,我们就会进入一个无限循环。幸运的是,延迟获取了盒子,但在不查看盒子内部的情况下产生了一个值。这填充next
,然后允许我们填充output
。现在output
已填充,当处理该电路的下一个输入时,前一个output
框将具有其值,准备好被要求以产生下一个next
,从而产生下一个output
。
听起来怎么样?
haskell - “介于”类别和箭头之间的类型类有意义吗?
通常你有类似 an Applicative
withoutpure
或类似 a Monad
, but without的东西return
。semigroupoid包用和覆盖了这些情况。现在我处于类似的情况,我无法定义一个有意义的函数,但我认为其他函数会很有意义。Apply
Bind
Arrow
arr
我定义了一个包含函数的类型,它是反向函数:
现在我无法实现Arrow
,但更弱一些:
我认为我无法实现 , 的等价物&&&
,因为它被定义为f &&& g = arr (\b -> (b,b)) >>> f *** g
,并且(\b -> (b,b))
不可逆。不过,您认为这个较弱的类型类可能有用吗?从理论的角度来看,它甚至有意义吗?
opengl - 在箭头内调用 IO Monad
也许我的做法是错误的,但我正在使用 HXT 读取一些我想在 HOpenGL 的数组中使用的顶点数据。顶点数组需要是通过调用 newArray 创建的 Ptr。不幸的是 newArray 返回一个 IO Ptr,所以我不确定如何在 Arrow 中使用它。我想我需要一个类型声明类似于 IO a -> Arrow a 的东西?
haskell - 如何将参数传递给HXT箭头以及如何使用-<<
我的问题如下。我有这个 xml 文件要解析:
我想有以下输出:
但是下面的代码给了我:
我只想解析一次 XML 以检索“错误标签”和 ERR。
我认为我的问题出在功能上errToLab
,但没有明显的解决方案。
谢谢你的帮助。
这是代码
haskell - 如何混合应用函子和箭头
我在 Andrew Birkett 的博客Applicative arrows for XML &&& return to pure上读到,我们可以混合使用箭头和应用函子。
我自己尝试过,但我没有我所期望的。我想要这个结果:
但我得到了这个:
我认为我的代码中有一个转折,但我不知道在哪里搜索。
如果有人可以提出一些帮助,下面是我的代码。
haskell - 如何处理嵌套记录和 listA 箭头
我有以下情况。我从探针中获得周数据。数据收集在几个 xml 文件中(在下面的代码中内联)。我需要将它们合并到一个文件中。虽然我将它们汇总在一个记录中,可以进一步翻译成一个文件。
我试图捕捉的结果记录如下:
如您所见,perfM收集所有数据。
但是下面的代码给了我。
我真的不清楚这里发生了什么以及我应该在哪里看。我认为它在 getYearOri 和 addOri 函数中,但到目前为止我所有的尝试都失败了。
如果有人可以给我一个关于要更改的代码的线索。
list - 用箭头比较列表长度
灵感来自比较列表长度
如果我想在列表列表中找到最长的列表,最简单的方法可能是:
一种更有效的方法是预先计算长度:
现在,我想更进一步。对于正常情况,它可能效率不高,但你能用箭头解决这个问题吗?我的想法基本上是,同时遍历所有列表,并继续步进,直到超过除最长列表之外的每个列表的长度。
在前面的(非常人为的)示例中,您只需通过每个列表采取两个步骤,以确定该列表[1..2^1000]
是最长的,而无需确定所述列表的整个长度。我可以用箭头来完成吗?如果是这样,那怎么办?如果不是,那为什么不呢?如何实施这种方法?
haskell - 在实践中使用单子、幺半群、函子和箭头
我最近遇到了这篇关于函数式编程不同方面的有用资源的帖子,例如 monads 和 monoids 等。
但问题是——普通程序员可以从这些概念中得到什么用处。我经常遇到关于这些问题的“学术”研究。但是,我在实践中(在实际项目中)从未遇到过使用它们的人。
所以问题是 - Haskell 中是否有任何广泛使用的开源项目真正利用了这些东西,这些项目证明了这个概念在“生产”软件中的实际必要性,而不是在编写的“学术”软件中”纯娱乐”。制作这样的列表会很酷:
- Monads - 用于 A 和 B 等项目,否则这样的代码看起来会复杂得多。
- 对幺半群也是如此。
- 函子也是如此。
- 箭也是一样。
haskell - Arrow 和 Monad,两个独立的观点来组成计算?
我在Monad.Reader#13中阅读了 Brent Yorgey 的“The Typeclassopedia” ,发现“Functor hierachy”与“the Category hierachy”相互依赖,如图 1 所示。
而且根据作者的说法ArrowApply == Monad
,特别是前面那个只是一个类型类实例,可以在什么时候使用
“我们希望能够从中间结果计算出一个箭头,并使用这个计算出的箭头继续计算。这是 ArrowApply 赋予我们的能力。”
但是我们怎样才能把这些东西放在一起呢?我的意思是 Monad 和 Arrow 中都有一些流控制功能(like if
and else
vs.ArrowChoice
或forM
vs. ArrowLoop
),而 Monad 中的某些功能似乎“缺失”了((***)
或(|||)
)first
。所有这些似乎我们需要在使用 Monad 或 Arrow 系统来构建我们的副作用计算流程之间做出选择,并且会在另一个系统中丢失一些特性。
haskell - 有没有可以像自动机一样使用的单子?
我正在编写从某种输入数据类型到输出数据类型的流转换器。输入由用户进行,因此事件之间有一些时间。因为每个输入都需要一些资源加载,所以我想“展望未来”,即将所有可能的输入发送到主计算并根据结果预加载资源。
目前,每次输入之后总是只有一个输出,但改变它最终可能会变得有趣。
我用 Ross Paterson 的 Automaton 变压器成功地实现了这一点。我不确定我的解决方案是否最佳。
- 有没有很好的例子如何做到这一点?也许甚至有测试代码?
- 它也可以用单子来实现吗?(例子?,解释为什么不可能?)
编辑:在调用更多细节之后,我在这里添加了代码。现在我要删除它(这是无法理解的)并添加一些其他解释。我的问题得到了回答。
我的意图是在每个用户输入被馈送到箭头/流转换器/任何东西之后停止主事件循环。然后它将存储当前的自动机状态并将所有可能的输入(假事件)一一发送给自动机,并查看必须加载哪些资源,以缓存它们。在下一个真实事件之后,它将使用缓存以获得更好的响应。主计算不应受此影响。