Haskell箭头:将值插入到列表中

3

我正在学习Haskell箭头,以便解析简单的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插入到 regions 列表的特定位置(例如在第二个元素之后或在名称以 'E' 开头的元素之后的元素之后)?

你是否正在寻找像这样的东西:从baseRegion开始连续调用regions(getXMLFromRegion region),以便你可以将结果追加到一个平面列表中? - iamnat
1个回答

2
我认为你需要的组合器是 (>>.),它属于 ArrowList 类型类。它允许您在箭头上应用任何列表函数。例如,在箭头前面添加一个元素就是这样的:
regions tree >>. (baseRegion:)

关于您的第二个问题,您可以编写一个实用函数将区域插入到列表中的正确位置,例如具有以下签名的内容:

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

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

regions tree >>. insertRegion baseRegion

顺便说一下,我个人会从你的regions函数中删除tree参数,并只使用显式箭头链,这样以上内容就变成了。

tree >>> regions >>. insertRegion baseRegion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接