我正在学习 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
  1. 怎么写 allRegions?或者,更好的是,我应该在哪里挖掘来写它?
  2. 另一个问题是如何不仅附加 regions的结果但插入 baseRegion 到区域列表的某个特定位置(例如在第二个元素之后或在名称以“E”开头的元素之后)?
有帮助吗?

解决方案

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

regions tree >>. (baseRegion:)

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

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

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

regions tree >>. insertRegion baseRegion

顺便说一句,我个人会从您的 regions 函数并仅使用显式箭头链接,因此上面的内容就变成了。

tree >>> regions >>. insertRegion baseRegion
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top