我在解析简单的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
allRegions
?或者,更好的是,我应该去哪里写它?regions
的结果,而且将baseRegion
插入区域列表的某个特定位置(例如在第二个元素之后或名称以''开头的元素之后) E')?答案 0 :(得分:2)
我认为您正在寻找的组合器(>>.)
类型为ArrowList
。它允许您在箭头上应用任何列表功能。例如。将元素添加到箭头的前面是。
regions tree >>. (baseRegion:)
关于第二个问题,您可以编写一个实用程序函数,将列表中的区域插入到正确的位置,例如像
这样的签名insertRegion :: Region -> [Region] -> [Region]
然后你可以在箭头
上使用它regions tree >>. insertRegion baseRegion
顺便说一下,我会亲自从regions
函数中删除树参数,只使用显式箭头链接,以便上面的内容成为。
tree >>> regions >>. insertRegion baseRegion