HXT中的逻辑OR,不会重复结果

时间:2014-06-27 03:20:50

标签: haskell xpath arrows combinators monoids

我在使用HXT时遇到了一些麻烦:我正在尝试找到符合某些条件的文档中的所有节点,并且我尝试将镜头/ XPath组合为谓词以类似OR的方式,使用Control.Arrow.<+>this guide建议。但是,当我试图&#34;运行&#34;我的文档上的箭头,我得到重复的结果。是否有一种简单的方法可以删除重复项,或以更有意义的方式组合测试?这是我的代码:

run :: App -> IO ()
run a = do
  inputContents <- readFile (input a)
  let doc = readString [withParseHTML yes, withWarnings no] inputContents
  links <- runX . xshow $ doc >>> indentDoc //> cssLinks
  mapM_ putStrLn links

cssLinks = links >>> (rels <+> hrefs <+> types)
  where
    links = hasName "link"
    rels = hasAttrValue "rel" (isInfixOf "stylesheet")
    hrefs = hasAttrValue "href" (endswith ".css")
    types = hasAttrValue "type" (== "text/css")

然而,每次我运行它(在任何网页上),我都会得到重复的结果/节点。我注意到<+>ArrowPlus typeclass的一部分,它模仿了一个幺半群,ArrowXMLArrowListArrowTree的一个实例,它给了我一个很多工作。我是否必须构建ArrowIf谓词?任何有关这方面的帮助都会很精彩:)

1 个答案:

答案 0 :(得分:1)

您可以将箭头结果作为[XmlTree],然后应用List.nub,然后获取字符串rep。

import "hxt" Text.XML.HXT.DOM.ShowXml as SX
...

  links <- runX $ doc >>> indentDoc //> cssLinks

  -- first remove duplicates (List.nub) then apply SX.xshow
  putStrLn (SX.xshow . L.nub $ links)