折叠箭头列出

时间:2010-10-27 06:13:54

标签: xml haskell arrows hxt

我在使用HXT时遇到了一些问题,但我怀疑这只是我对箭头的遗漏。

我有一个像

这样的XML结构
<str name="field1">value</str>
<lst name="field2"><str>value2</str><str>value3</str></lst>

内部结构如

data XmlData = XmlStr String | XmlList XmlData

有没有办法在箭头的一个步骤中收集元素?

getXmlData :: IOSArrow XmlTree (String, XmlData)
getXmlData = (getAttrl >>> getChildren >>> getText) &&& 
      ((filterByType "str" >>> getText >>> arr (\x -> XmlStr x))
      <+> (filterByType "lst" >>> getXmlData))
  where filterByType t = isElem >>> hasName t >>> getChildren

对getXmlData的递归调用需要收集它的答案并包装在XmlList构造函数中,但我不知道如何收集术语。目前我正在通过对输出进行一些后期处理(收集相同名称)来实现这一点,但我想要一个更好的解决方案。

1 个答案:

答案 0 :(得分:3)

通常,您可以使用Control.Arrow.ArrowList中的listA来执行此操作。它的类型为(ArrowList a) => a b c -> a b [c],是

  用于转换箭头的组合器   与所有人一起成为一个确定的版本   结果收集在一个元素中   列表。

(有关具体示例,请参阅我的答案herehere。)

在这种特定情况下,您可以使用>.组合子和XmlList构造函数作为其第二个参数来更简洁地完成相同的操作。