Comprimi freccia alla lista
Domanda
Sto avendo alcuni problemi con HXT , anche se ho il sospetto che è solo qualcosa che mi manca circa frecce.
Ho una struttura XML come
<str name="field1">value</str>
<lst name="field2"><str>value2</str><str>value3</str></lst>
E struttura interna come
data XmlData = XmlStr String | XmlList XmlData
C'è un modo per gli elementi si raccolgano un passo in una freccia?
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
La chiamata ricorsiva per getXmlData ha bisogno di raccogliere essa la risposta e avvolgere in un costruttore XMLList, ma non so come raccogliere termini. Attualmente sto realizzazione di questo con un po 'di post-elaborazione in uscita (la raccolta sullo stesso nome), ma vorrei una soluzione migliore.
Soluzione
In generale, è possibile utilizzare listA
da Control.Arrow.ArrowList
per fare questo. Ha tipo (ArrowList a) => a b c -> a b [c]
ed è un
combinatore per la conversione di una freccia in una versione con tutte le determinstic risultati raccolti in un unico elemento lista.
(Guarda i miei risposte qui e qui per un esempio concreto.)
In questo caso specifico è possibile utilizzare il combinatore >.
con il costruttore XmlList
come secondo argomento per ottenere la stessa cosa in modo più conciso.