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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top