折叠箭头至列表
问题描述:
我遇到了一些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构造函数包,但我不知道如何收集条款。目前,我正在通过输出的一些后处理(以相同名称收集)来完成此任务,但我想要一个更好的解决方案。
答
一般而言,您可以使用listA
从Control.Arrow.ArrowList
来执行此操作。它具有类型(ArrowList a) => a b c -> a b [c]
并且是
组合子为箭头 转换成确定型版在单个元件 列表收集的所有 结果。
在可以使用>.
组合子与XmlList
构造函数作为第二个参数来完成同样的事情更简洁这种特殊情况下。
>。当我将getChildren调用移出帮助器并添加了一些括号时就起作用了。我很好奇listA的使用情况,但无法找到它作为管道一部分的示例。你能提供一个listA解决方案吗? – amccausl 2010-10-27 16:49:29
@amccausl:在上面链接的第一个答案中,我们有一个类型为“XmlTree(String,String)”的非确定性箭头,我们希望将它与'arr Data.Map.fromList'(类型为'a [( String,String)](M.Map String String)')来填充地图。 'listA'让我们使箭头的类型匹配起来,以便它们可以组成。 – 2010-10-27 17:14:13