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

haskell - HXT 的计数和过滤箭头

我正在尝试解析 XML,但我想过滤并仅从给定节点中提取确定数量的子节点。例如:

然后,如果我执行箭头getChildren >>> myFilter 2,我将只取回 ID 为“a”和“b”的节点。

直觉告诉我应该使用状态箭头来跟踪,但我不知道该怎么做。

我试着自己做,但这不是我想要的,看起来不是很优雅,也不起作用。我尝试使用runSLA整数参数作为初始状态运行我的箭头链,然后定义:

但是我当然不能返回Nothing,我需要返回一个 XmlTree。但我根本不想退货!

那里可能有更好的方法。你能帮助我吗?

感谢您的时间和帮助!

0 投票
1 回答
356 浏览

haskell - 关于箭头运算符的快速问题

说我有f :: u -> v -> wg :: x -> y -> z。我想要的是h :: (u,x) -> (v,y) -> (w,z)

所以我可以手动解决这个问题:

但这其中的乐趣在哪里?

使用(***)我可以中途到达那里:

但我不知道如何到达最后一英里。

0 投票
2 回答
4589 浏览

haskell - Haskell rec 关键字是如何工作的?

在箭头符号中,您可以使用 rec 关键字来编写递归定义。例如:

这怎么能评价?似乎它只会进入无限循环或其他东西。我知道它计算为循环箭头组合器,但我也不明白它是如何工作的。

编辑:那个权力的例子真的很有帮助。但是,您将如何使用 do 表示法来编写它?我假设您需要使用rec。

0 投票
2 回答
515 浏览

generics - Haskell 中的泛型类型转换

我正在尝试编写一个带有常规函数的箭头转换器,并将它们转换为抽象值的计算。如果我们有一个“源”箭头,

那么目标是让f处理提升的 [原文如此?] 抽象值类型,在这个例子中

然而,为了成功地实现这个箭头,需要提升一些类型,以便在任意深度拥有具有一些具体值和一些抽象值的异构数据结构。我最终做的是为常规的 haskell 构造函数添加特殊类型,例如,如果

然后我为元组构造函数 (,) 添加一个抽象表示,

并且g的代码被提升到 [展开一点],

AVEither 也需要这样做。这最终会成为很多案例。有没有一个很好的方法来解决这个问题?

我是 Haskell 新手,所以请给我发参考资料或半详细的解释;可能我读过的最接近的东西是 SYBR 论文(废弃你的样板革命)第 1-3 节。

非常非常感谢你!

0 投票
1 回答
1390 浏览

debugging - Haskell中的无限递归

这个问题本质上是使用 GHCi 在 Haskell 程序中调试无限循环的副本。那里的作者手动解决了它,但我想知道其他解决方案

(我的特殊问题)

我有一个包含递归调用的箭头代码,

应该使递归 testAVFunctor 不执行,因为这errorArrow将导致 isError 返回 a Left (AVError "good error"),它应该依次选择passError路由并绕过递归调用。

非常奇怪的是,在函数组合等流行站点插入“跟踪”调用会导致程序发出有限数量的输出,然后冻结。不是我对无限项扩展问题的期望。(见编辑1)

如果有人很好奇,我已经在这里上传了我的源代码。

编辑 1

我没有找对地方(如果您想查看源代码,显然avEither正在循环)。我到达那里的方式是编译一个二进制文件并运行 gdb

  • gdb 主要
  • r (运行代码)
  • Ctrl+C (发送中断)。回溯将是无用的,但你能做的,是命中
  • s (步骤)。然后,按住回车键;您应该会看到很多方法名称飞过。希望其中一个能够被识别。

您可以使用 ghc 标志进行编译-O0以禁用优化,这可以显示更多方法名称。

编辑 3

显然,proc x -> do上面的代码块导致代码生成组合子,这些组合子正在调用AVFunctor.arr要调用的提升方法——其中的某些东西一定违反了惰性。如果我将顶级函数重写为

然后一切正常。我想是时候尝试学习和使用garrows(伯克利的一名研究生)。

我从经验中得出的一般结论是 ghci 调试可能会令人沮丧。例如,我设法将参数显示fAVFunctor.arr局部变量,但我无法从中获得任何非常有用的信息:

修改后的源代码在这里

0 投票
2 回答
431 浏览

haskell - 为什么我不能用 arr 和 *** / &&& 定义 Haskell Arrow 实例

我仍然在掌握在 Haskell 中定义和使用箭头。在定义新箭头时,我更容易考虑 *** 或 &&& 而不是第一个和第二个,因为大多数时候我希望对两个箭头组合时进行特殊处理。

然而,Arrow 类不允许根据 arr 和 *** 或 &&& 定义箭头,并且需要包含 first 的定义。这意味着我被迫编写如下代码 -

在我看来,在 Control.Arrow 模块中包含“first”的默认定义并没有什么害处。这将允许我们在定义 first 或 *** 之间进行选择。

第一个默认定义没有包含在 Arrow 类中是否有充分的理由?我能想到的唯一原因是用户可能会忽略 first 和 *** 的定义,然后你会有循环定义,但这是唯一的原因吗?

0 投票
1 回答
393 浏览

haskell - GHC 的语言扩展:“Arrows”的源代码在哪里?

我在哪里可以找到隐藏在语言杂注后面的源代码

我已经阅读了相应的论文(例如Paterson,A New Notation for Arrows),所以理论上发生的事情很清楚。现在我想看看,这实际上是如何翻译成源代码的。

我所有的搜索都只指向 GHC 的用户指南或 Control.Arrow 的来源。我在这里错过了什么吗?

0 投票
1 回答
395 浏览

xml - 从简单 XML 中获取数据

我正在尝试使用 HXT 从 6 行的 XML 输入中提取一些数据。我也想保留 HXT,因为 Curl 集成,而且我还有其他包含数千行的 XML 文件,稍后。

我的 XML 如下所示:

而且我一直在努力弄清楚如何解析它。不幸的是,HXT 的 Wiki 页面并没有太大帮助(或者我只是忽略了一些东西)。

我总是得到的是

所以,我想,解析一定会出错,因为我检查并正确地从查询中获取了 XML。

0 投票
2 回答
687 浏览

haskell - 如何为箭头定义过滤函数?

我目前正在阅读 John Hughes 的论文Programming with Arrows,我已经被第 20 页第 2.5 节的第一个练习难住了。

我们可以使用Arrow和类型类,以及通过类型的函数、流函数和单子函数的ArrowChoice实例。[a] -> [b]a -> m bKleisli

举了一个mapA例子:

这是一个尝试:

这种徒劳的尝试背后的(蛮力)基本原理如下:有两种选择filterAlistcaselikemap和应用 predicate 的结果p。它开始于map,检查列表并使用返回一个 Either 值listcase。在应用空列表的情况下g,否则右侧的所有内容|||都应用于 type 的值,分别(a,[a])包含headtail。该h函数首先应用,它应用谓词同时保留head,返回一个类型的值((Bool, head),tail)。这被传递给,它根据值(uncurry helper)决定是否保留。它将结果作为headBoolEither值,以便我们可以将选择方法(|||)应用于它。这个值被传递给下一个选择:(j ||| (filterA p))这样,如果谓词被持有Truethenj将应用于包含headand的对tail。被head过滤,idfilter p被应用于tail。两个结果都成对返回。arr (uncurry (:))然后使用like协调这对map。否则,将单独tail传递给。filterA p

我怀疑它是否像我想象的那样困难,我想我错过了一些非常明显的东西。

0 投票
1 回答
296 浏览

haskell - 是 (map f) == concatMap (map f . (:[])) 吗?

我为类的流函数(SF)定义了left/right方法ArrowChoice如下: newtype SF a b = SF { runSF :: [a] -> [b] }

ghci 中的一些测试看起来一切都很好:

但是使用它却mapA另有说明:

正确答案应该是:

其中 mapA 定义为: