Свернуть стрелку в список
Вопрос
У меня проблемы с некоторыми проблемами HXT., Хотя я подозреваю, что это просто то, что я скучаю по стрелкам.
У меня есть структура XML, как
<str name="field1">value</str>
<lst name="field2"><str>value2</str><str>value3</str></lst>
И внутренняя структура, как
data XmlData = XmlStr String | XmlList XmlData
Есть ли способ собирать элементы на шаге в стрелке?
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
Конструктор как его второй аргумент для достижения того же самого кратко.