HXT - что такое "глубоко"? - PullRequest
       0

HXT - что такое "глубоко"?

4 голосов
/ 10 октября 2010

Я потратил много времени, пытаясь понять, как использовать HXT.Я продолжаю идти против примеров, использующих deep.Что делает deep?

Например, этот код имеет следующее:

atTag tag = deep (isElem >>> hasName tag)

Другой пример:

-- case-insensitive tag matching
atTagCase tag = deep (isElem >>> hasNameWith ((== tag') . upper . localPart))
  where tag' = upper tag
        upper = map toUpper

1 Ответ

8 голосов
/ 10 октября 2010

http://hackage.haskell.org/packages/archive/hxt/latest/doc/html/Control-Arrow-ArrowTree.html#v:deep

deep :: Tree t => a (t b) c -> a (t b) cSource

рекурсивно ищет во всем дереве поддеревья, для которых существует предикат. Поиск выполняется сверху вниз. Когда дерево найдено, оно становится элементом списка результатов. Найденное дерево больше не проверяется на предмет любого подстресса, для которого также мог бы храниться предикат. См. multi для поиска такого типа.

пример: deep isHtmlTable выбирает все элементы таблицы верхнего уровня в документе (с соответствующим определением для isHtmlTable), но в ячейке таблицы нет таблиц.

В документации можно найти имя функции или подпись типа с помощью Hoogle или Hayoo!


В основном, если дерево XML похоже на

<p>
    <strong id="a">
       <em id="b">
          <strong id="c">
             foo
          </strong>
       </em>
    </strong>
    <ins id="d">
       <strong id="e">
          bar
       </strong>
       <em id="f">
          baz
       </em>
    </ins>
</p>

deep (isElem >>> hasName "strong") tree вернет список для

<strong id="a">
<strong id="e">

потому что мы можем найти эти два <strong> s при входе в дерево, тогда как (isElem >>> hasName tag) tree вернет пустой список, потому что корнем дерева является <p>, а не <strong>

...