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はArrowListとArrowTreeの両方のインスタンスであるため、多くの作業が必要です。ArrowIf述語を作成する必要がありますか? これに関するどんな助けも素晴らしいでしょう:)