2012-04-21 8 views
2

を使用して、指定されたツリー内で最初に成功した変換(深さ優先)の後に停止するHTML処理矢印を作成しようとしています。私。 HTML文書内の非常に最初のリスト項目に「最初の」クラスを追加するには例えばタイプHXT:最初に変換が成功した後に処理を停止する方法はありますか?

processFirst :: (ArrowTree a, Tree t) => a (t b) (t b) -> a (t b) (t b) 

と機能、1が矢印

processFirst (hasName "li" `guards` addAttr "class" "first") 

を構築することができ、私はむしろ新たなんですHXTと私は今数時間、APIドキュメントを読んでいて、processFirstを実装する方法を理解しようとしていますが、すべての部分を合わせることができませんでした。 processTopDownUntilは当初は有望であったが、その関数は特定のサブツリーの処理を止めるだけなので、ネストしたものを除くすべての要素を変換する。

test = flip runLA undefined $ xshow $ 
    constA "<xml><x>X1</x><x>X2</x></xml>" >>> xread 
    >>> processFirst (hasName "x" `guards` addAttr "class" "first") 

processFirst f = f `orElse` processChildren (processFirst f) 

processFirstの定義は、の定義と同じである:

答えて

1

私は完全に質問を理解してわからないんだけど、私がお答えしてみます:)

は、次を試してみましょうprocessTopDownUntil。この関数は、のような何かを出力します:

["<xml><x class=\"first\">X1</x><x class=\"first\">X2</x></xml>"] 

は問題が明らかである - fは、最上位のノードで失敗した場合、その後、processFirstはすべての子供のために呼び出されます。 fが子どもに成功した場合、他の子供の処理を中止する方法が必要です。

解決策は、状態の矢印を使用することができます

processFirst f = fromSLA False process 
    where 
    process = (getState >>> isA not) 
      `guards` 
      (f >>> changeState (const $ const True)) 
      `orElse` 
      processChildren process 

アイデアはfが成功したときの状態を設定し、処理の前に、それをチェックすることです。

注:今すぐfSLAになるはずです。あなたが望むものでない場合は、すべての子供を集め(例えばlistAなどを使用して)、それらを純粋に処理しようとすることができます。

解決策は理想的ではありませんが、出発点として役立つことを願っています。

関連する問題