2

HXTに少し問題があります: いくつかの基準に一致するドキュメント内のすべてのノードを見つけようとしています。レンズ/XPath を OR のような方法で述語として結合しようとしてControl.Arrow.<+>ます。ガイドが提案します。ただし、ドキュメントで矢印を「実行」しようとすると、結果が重複します。重複を削除したり、より意味のある方法でテストを組み合わせたりする簡単な方法はありますか? これが私のコードです:

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")

しかし、これを (任意の Web ページで) 実行するたびに、結果/ノードが重複します。これはモノイドを模倣するArrowPlus typeclass<+>の一部であり、ArrowXMLはArrowListArrowTreeの両方のインスタンスであるため、多くの作業が必要です。ArrowIf述語を作成する必要がありますか? これに関するどんな助けも素晴らしいでしょう:)

4

1 に答える 1