2010-10-27 155 views
3

我遇到了一些HXT的问题,但我怀疑这只是我失踪的箭头。折叠箭头至列表

我有一个像

<str name="field1">value</str> 
<lst name="field2"><str>value2</str><str>value3</str></lst> 

和内部结构像

data XmlData = XmlStr String | XmlList XmlData 

XML结构是否有办法来收集在箭头一步元素?

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构造函数包,但我不知道如何收集条款。目前,我正在通过输出的一些后处理(以相同名称收集)来完成此任务,但我想要一个更好的解决方案。

回答

3

一般而言,您可以使用listAControl.Arrow.ArrowList来执行此操作。它具有类型(ArrowList a) => a b c -> a b [c]并且是

组合子为箭头 转换成确定型版在单个元件 列表收集的所有 结果。

(见我的答案herehere对于一个具体的例子。)

在可以使用>.组合子与XmlList构造函数作为第二个参数来完成同样的事情更简洁这种特殊情况下。

+0

>。当我将getChildren调用移出帮助器并添加了一些括号时就起作用了。我很好奇listA的使用情况,但无法找到它作为管道一部分的示例。你能提供一个listA解决方案吗? – amccausl 2010-10-27 16:49:29

+1

@amccausl:在上面链接的第一个答案中,我们有一个类型为“XmlTree(String,String)”的非确定性箭头,我们希望将它与'arr Data.Map.fromList'(类型为'a [( String,String)](M.Map String String)')来填充地图。 'listA'让我们使箭头的类型匹配起来,以便它们可以组成。 – 2010-10-27 17:14:13