折叠箭头到列表

问题描述 投票:0回答:1

我在 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 构造函数中,但我不知道如何收集术语。 目前,我正在通过对输出进行一些后处理(收集同名)来完成此任务,但我想要一个更好的解决方案。

xml haskell hxt arrow-abstraction
1个回答
3
投票

一般来说,您可以使用

listA
 中的 
Control.Arrow.ArrowList
来执行此操作。它的类型为
(ArrowList a) => a b c -> a b [c]
并且是

用于转换箭头的组合器 到一个确定的版本与所有 结果收集在单个元素中 列表。

(具体示例请参阅我的答案此处此处。)

在这种特定情况下,您可以使用

>.
组合器和
XmlList
构造函数作为其第二个参数,以更简洁地完成相同的操作。

© www.soinside.com 2019 - 2024. All rights reserved.