3

在解析简单的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's 结果,而且插入baseRegion到区域列表的某个特定位置(例如在第二个元素之后或在名称以 'E' 开头的元素之后)?
4

1 回答 1

2

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

regions tree >>. (baseRegion:)

所以对于你的第二个问题,你可以编写一个实用函数来将列表中的区域插入到正确的位置,例如带有签名的东西

insertRegion :: Region -> [Region] -> [Region]

然后你可以在箭头上使用它

regions tree >>. insertRegion baseRegion

顺便说一句,我会亲自从您的函数中删除树参数,regions并使用显式箭头链接,这样就变成了上面的内容。

tree >>> regions >>. insertRegion baseRegion
于 2014-04-14T09:45:34.273 回答