2010-10-27 151 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