haskell - HXT 的计数和过滤箭头

标签 haskell state arrows hxt

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

<root>
    <node id="a" />
    <node id="b" />
    <node id="c" />
    <node id="d" />
</root>

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

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

我试着自己做,但这不是我想要的,看起来不是很优雅,而且不起作用。我尝试用 runSLA 运行我的箭头链和一个整数参数作为初始状态,然后定义:
takeOnly :: IOSLA Int XmlTree XmlTree
takeOnly = changeState (\s b -> s-1)
             >>> accessState (\s b -> if s >= 0 then b else Nothing)

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

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

感谢您的时间和帮助!

最佳答案

使用 Control.Arrow.ArrowList 中的组合子可能更惯用。处理这种事情。

包中专门提供(>>.) :: a b c -> ([c] -> [d]) -> a b d ,这是一个“将列表箭头的结果转换为另一个列表的组合器”。这允许我们使用 take在这种情况下,我们已经为列表提供了功能。

这是您如何使用它的快速版本:

module Main where

import Text.XML.HXT.Arrow

takeOnly :: (ArrowXml a) => Int -> a XmlTree XmlTree
takeOnly n = getChildren >>. take n 

main = do
  let xml = "<root><node id='a' /><node id='b' />\
                  \<node id='c' /><node id='d' /></root>"

  print =<< runX (readString [] xml >>> getChildren >>> takeOnly 2)

我相信这大约可以满足您的需求:
travis@sidmouth% ./ArrowTake
[NTree (XTag (LP node) [NTree (XAttr (LP id)) [NTree (XText "a") []]]) [],
 NTree (XTag (LP node) [NTree (XAttr (LP id)) [NTree (XText "b") []]]) []]

没有 IOSLA必需的。请注意,我还稍微更改了函数类型——这个版本对我来说似乎更好,但您可以轻松地将其转换为更像您版本中的类型。

关于haskell - HXT 的计数和过滤箭头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5175906/

相关文章:

Haskell 类型族和虚拟参数

haskell - Haskell 中的纯函数是否有可能改变变量的本地副本?

haskell - 如何将 Functor 实例赋予为一般递归方案构建的数据类型?

javascript - JSON.parse(JSON.stringify(state)) 是否保证 redux 状态不发生变化?

haskell - 什么是箭头,我该如何使用它们?

xml - 在 Haskell 中为箭头函数提供参数

javascript - React setState 不更新数组

javascript - 由于误用状态,数组未动态更新

r - 在 plotly 中将箭头段添加到散点图

xml - 从简单的 XML 中获取数据