Réduire la flèche à la liste
Question
Je vais avoir quelques problèmes avec HXT , bien que je pense qu'il est juste quelque chose que je me manque sur les flèches.
J'ai une structure XML comme
<str name="field1">value</str>
<lst name="field2"><str>value2</str><str>value3</str></lst>
structure interne comme
data XmlData = XmlStr String | XmlList XmlData
Y at-il un moyen d'éléments à frais virés un pas dans une flèche?
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
L'appel récursif à getXmlData doit recueillir de réponse et l'envelopper dans un constructeur XMLList, mais je ne sais pas comment collecter des termes. Actuellement, je suis avec un certain accomplissement de cette post-traitement sur la sortie (collecte sur le même nom), mais je voudrais une meilleure solution.
La solution
En général, vous pouvez utiliser listA
Control.Arrow.ArrowList
pour le faire. Il est de type (ArrowList a) => a b c -> a b [c]
et est
combinateurpour convertir une flèche dans une version determinstic avec tous résultats recueillis dans un seul élément liste.
(Voir mes réponses et pour un exemple concret.)
Dans ce cas spécifique, vous pouvez utiliser le combinateur >.
avec le constructeur de XmlList
comme second argument pour accomplir la même chose de façon plus concise.