Haskell箭头:将值插入列表

时间:2014-04-13 14:42:10

标签: haskell hxt

我在解析简单的html页面时正在学习haskell箭头。 任务是下载基础区域baseRegion = Region "Yekaterinburg" "http://example.com/r/ekb"的站点,解析到另一个区域的链接(通过hxt):

regions :: ArrowXml cat => cat a (NTree XNode) -> cat a Region
regions tree =
  tree >>> multi (hasName "a" >>> hasAttrValue "class" (== ".regionlink")) >>>
    proc x -> do
      rname <- getText <<< getChildren -< x
      rurl <- getAttrValue "href" -< x
      returnA -< Region rname rurl

并在结果中附加一个基本区域:

allRegions :: ArrowXml cat => cat a (NTree XNode) -> cat a Region
  1. 如何撰写allRegions?或者,更好的是,我应该去哪里写它?
  2. 另一个问题是如何不仅附加regions的结果,而且将baseRegion插入区域列表的某个特定位置(例如在第二个元素之后或名称以''开头的元素之后) E')?

1 个答案:

答案 0 :(得分:2)

我认为您正在寻找的组合器(>>.)类型为ArrowList。它允许您在箭头上应用任何列表功能。例如。将元素添加到箭头的前面是。

regions tree >>. (baseRegion:)

关于第二个问题,您可以编写一个实用程序函数,将列表中的区域插入到正确的位置,例如像

这样的签名
insertRegion :: Region -> [Region] -> [Region]

然后你可以在箭头

上使用它
regions tree >>. insertRegion baseRegion

顺便说一下,我会亲自从regions函数中删除树参数,只使用显式箭头链接,以便上面的内容成为。

tree >>> regions >>. insertRegion baseRegion