Свернуть стрелку в список - PullRequest
3 голосов
/ 27 октября 2010

У меня проблемы с 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, но я не знаю, как собирать термины.В настоящее время я выполняю это с некоторой пост-обработкой на выходе (сбор с тем же именем), но я бы хотел лучшее решение.

1 Ответ

3 голосов
/ 27 октября 2010

Как правило, вы можете использовать listA из Control.Arrow.ArrowList, чтобы сделать это.Он имеет тип (ArrowList a) => a b c -> a b [c] и является комбинатором

для преобразования стрелки в детерминированную версию со всеми результатами, собранными в одном списке элементов.

(См. Мои ответы здесь и здесь для конкретного примера.)

В этом конкретном случае вы можете использовать комбинатор >. с конструктором XmlList в качестве второго аргумента длявыполнить то же самое более кратко.

...