题
我正在学习 haskell arrows 来解析简单的 html 页面。任务是下载基地地区的站点 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”开头的元素之后)?
解决方案
我认为你正在寻找的组合器是 (>>.)
在里面 ArrowList
类型类。它允许您在箭头上应用任何列表功能。例如。在箭头前面添加一个元素将是。
regions tree >>. (baseRegion:)
对于第二个问题,您可以编写一个实用函数来将列表中的区域插入到正确的位置,例如带有签名的东西,例如
insertRegion :: Region -> [Region] -> [Region]
然后你可以在箭头上使用它
regions tree >>. insertRegion baseRegion
顺便说一句,我个人会从您的 regions
函数并仅使用显式箭头链接,因此上面的内容就变成了。
tree >>> regions >>. insertRegion baseRegion
不隶属于 StackOverflow