gpt4 book ai didi

haskell - HXT:左因子非确定性箭头?

转载 作者:行者123 更新时间:2023-12-04 12:49:46 27 4
gpt4 key购买 nike

我正在尝试接受 Haskell 的 XML 工具箱 (HXT) 并且我在某处碰壁,因为我似乎没有完全掌握箭头作为一种计算工具。

这是我的问题,我希望使用 GHCi session 更好地说明:

> let parse p = runLA (xread >>> p) "<root><a>foo</a><b>bar</b><c>baz</c></root>"
> :t parse
parse :: LA XmlTree b -> [b]

所以 Parse 是一个小的辅助函数,它将我给它的任何箭头应用到琐碎的 XML 文档
<root>
<a>foo</a>
<b>bar</b>
<c>baz</c>
</root>

我定义了另一个辅助函数,这次是提取具有给定名称的节点下面的文本:
> let extract s = getChildren >>> isElem >>> hasName s >>> getChildren >>> getText 
> :t extract
extract :: (ArrowXml cat) =>
String -> cat (Data.Tree.NTree.TypeDefs.NTree XNode) String
> parse (extract "a" &&& extract "b") -- extract two nodes' content.
[("foo","bar")]

借助此功能,可以轻松使用 &&&组合器将两个不同节点的文本配对,然后将其传递给构造函数,如下所示:
> parse (extract "a" &&& extract "b" >>^ arr (\(a,b) -> (b,a))) 
[("bar","foo")]

现在到了我不明白的部分:我想左因子! extract来电 getChildren在根节点上两次。相反,我希望它只调用一次!所以我首先得到根节点的 child
> let extract' s = hasName s >>> getChildren >>> getText
> :t extract'
extract' :: (ArrowXml cat) => String -> cat XmlTree String
> parse (getChildren >>> isElem >>> (extract' "a" &&& extract' "b"))
[]

请注意,我已尝试重新排序对 isElem 等的调用,以确定是否是问题所在。但就目前而言,我只是不知道为什么这不起作用。有一个箭头'教程' on the Haskell wiki和我理解的方式,应该可以做我想做的事——即使用 &&&为了配对两个计算的结果。

它也确实有效——但只是在箭头链的开始,而不是在低谷的中间,当我已经有了一些结果时,我想保持“共享”。我有一种感觉,就是无法理解正常函数组合和箭头符号之间的想法差异。我会非常感谢任何指针! (即使它只是一些比 Haskell-wiki 更深入的通用箭头教程。)

谢谢!

最佳答案

如果您将箭头转换为(然后从)确定性版本,这将按预期工作:

> let extract' s = unlistA >>> hasName s >>> getChildren >>> getText
> parse (listA (getChildren >>> isElem) >>> (extract' "a" &&& extract' "b"))
[("foo","bar")]

然而,这并不令人满意,我不记得为什么 (&&&)使用不确定的箭头以这种方式运行(我个人会使用 proc/do notation 来处理比这更复杂的事情)。

更新: runLA 这里似乎发生了一些奇怪的事情和 xread .如果您使用 runXreadString一切都按预期工作:
> let xml = "<root><a>foo</a><b>bar</b><c>baz</c></root>"
> let parse p = runX (readString [] xml >>> p)
> let extract' s = getChildren >>> hasName s >>> getChildren >>> getText
> parse (getChildren >>> isElem >>> (extract' "a" &&& extract' "b"))
[("foo","bar")]

这意味着您必须在 IO 中运行解析器。 monad,但使用 runX 有好处无论如何(更好的错误消息等)。

关于haskell - HXT:左因子非确定性箭头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4220316/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com