问题标签 [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 - HXT 的计数和过滤箭头
我正在尝试解析 XML,但我想过滤并仅从给定节点中提取确定数量的子节点。例如:
然后,如果我执行箭头getChildren >>> myFilter 2
,我将只取回 ID 为“a”和“b”的节点。
直觉告诉我应该使用状态箭头来跟踪,但我不知道该怎么做。
我试着自己做,但这不是我想要的,看起来不是很优雅,也不起作用。我尝试使用runSLA
整数参数作为初始状态运行我的箭头链,然后定义:
但是我当然不能返回Nothing
,我需要返回一个 XmlTree。但我根本不想退货!
那里可能有更好的方法。你能帮助我吗?
感谢您的时间和帮助!
haskell - 关于箭头运算符的快速问题
说我有f :: u -> v -> w
和g :: x -> y -> z
。我想要的是h :: (u,x) -> (v,y) -> (w,z)
。
所以我可以手动解决这个问题:
但这其中的乐趣在哪里?
使用(***)
我可以中途到达那里:
但我不知道如何到达最后一英里。
haskell - Haskell rec 关键字是如何工作的?
在箭头符号中,您可以使用 rec 关键字来编写递归定义。例如:
这怎么能评价?似乎它只会进入无限循环或其他东西。我知道它计算为循环箭头组合器,但我也不明白它是如何工作的。
编辑:那个权力的例子真的很有帮助。但是,您将如何使用 do 表示法来编写它?我假设您需要使用rec。
generics - Haskell 中的泛型类型转换
我正在尝试编写一个带有常规函数的箭头转换器,并将它们转换为抽象值的计算。如果我们有一个“源”箭头,
那么目标是让f处理提升的 [原文如此?] 抽象值类型,在这个例子中
然而,为了成功地实现这个箭头,需要提升一些类型,以便在任意深度拥有具有一些具体值和一些抽象值的异构数据结构。我最终做的是为常规的 haskell 构造函数添加特殊类型,例如,如果
然后我为元组构造函数 (,) 添加一个抽象表示,
并且g的代码被提升到 [展开一点],
AVEither 也需要这样做。这最终会成为很多案例。有没有一个很好的方法来解决这个问题?
我是 Haskell 新手,所以请给我发参考资料或半详细的解释;可能我读过的最接近的东西是 SYBR 论文(废弃你的样板革命)第 1-3 节。
非常非常感谢你!
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 调试可能会令人沮丧。例如,我设法将参数显示f
为AVFunctor.arr
局部变量,但我无法从中获得任何非常有用的信息:
修改后的源代码在这里
haskell - 为什么我不能用 arr 和 *** / &&& 定义 Haskell Arrow 实例
我仍然在掌握在 Haskell 中定义和使用箭头。在定义新箭头时,我更容易考虑 *** 或 &&& 而不是第一个和第二个,因为大多数时候我希望对两个箭头组合时进行特殊处理。
然而,Arrow 类不允许根据 arr 和 *** 或 &&& 定义箭头,并且需要包含 first 的定义。这意味着我被迫编写如下代码 -
在我看来,在 Control.Arrow 模块中包含“first”的默认定义并没有什么害处。这将允许我们在定义 first 或 *** 之间进行选择。
第一个默认定义没有包含在 Arrow 类中是否有充分的理由?我能想到的唯一原因是用户可能会忽略 first 和 *** 的定义,然后你会有循环定义,但这是唯一的原因吗?
haskell - GHC 的语言扩展:“Arrows”的源代码在哪里?
我在哪里可以找到隐藏在语言杂注后面的源代码
我已经阅读了相应的论文(例如Paterson,A New Notation for Arrows),所以理论上发生的事情很清楚。现在我想看看,这实际上是如何翻译成源代码的。
我所有的搜索都只指向 GHC 的用户指南或 Control.Arrow 的来源。我在这里错过了什么吗?
xml - 从简单 XML 中获取数据
我正在尝试使用 HXT 从 6 行的 XML 输入中提取一些数据。我也想保留 HXT,因为 Curl 集成,而且我还有其他包含数千行的 XML 文件,稍后。
我的 XML 如下所示:
而且我一直在努力弄清楚如何解析它。不幸的是,HXT 的 Wiki 页面并没有太大帮助(或者我只是忽略了一些东西)。
我总是得到的是
所以,我想,解析一定会出错,因为我检查并正确地从查询中获取了 XML。
haskell - 如何为箭头定义过滤函数?
我目前正在阅读 John Hughes 的论文Programming with Arrows,我已经被第 20 页第 2.5 节的第一个练习难住了。
我们可以使用Arrow
和类型类,以及通过类型的函数、流函数和单子函数的ArrowChoice
实例。[a] -> [b]
a -> m b
Kleisli
举了一个mapA
例子:
这是一个尝试:
这种徒劳的尝试背后的(蛮力)基本原理如下:有两种选择filterA
:listcase
likemap
和应用 predicate 的结果p
。它开始于map
,检查列表并使用返回一个 Either 值listcase
。在应用空列表的情况下g
,否则右侧的所有内容|||
都应用于 type 的值,分别(a,[a])
包含head
和tail
。该h
函数首先应用,它应用谓词同时保留head
,返回一个类型的值((Bool, head),tail)
。这被传递给,它根据值(uncurry helper)
决定是否保留。它将结果作为head
Bool
Either
值,以便我们可以将选择方法(|||)
应用于它。这个值被传递给下一个选择:(j ||| (filterA p))
这样,如果谓词被持有True
thenj
将应用于包含head
and的对tail
。被head
过滤,id
而filter p
被应用于tail
。两个结果都成对返回。arr (uncurry (:))
然后使用like协调这对map
。否则,将单独tail
传递给。filterA p
我怀疑它是否像我想象的那样困难,我想我错过了一些非常明显的东西。
haskell - 是 (map f) == concatMap (map f . (:[])) 吗?
我为类的流函数(SF)定义了left
/right
方法ArrowChoice
如下:
newtype SF a b = SF { runSF :: [a] -> [b] }
ghci 中的一些测试看起来一切都很好:
但是使用它却mapA
另有说明:
正确答案应该是:
其中 mapA 定义为: