2010-10-10 73 views
4

我正在花很多時間試圖弄清楚如何使用HXT。我繼續使用deep反對示例。 deep做什麼?HXT - 什麼是「深」?

例如,this code具有以下:

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

Another example:

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

回答

8

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 

遞歸搜索子樹整個樹中,其中predica te擁有。搜索從上到下進行。當找到一棵樹時,這成爲結果列表的一個元素。找到的樹不會進一步檢查任何子句,謂詞也可以適用。這種搜索請參見multi

示例:deep isHtmlTable選擇文檔中的所有頂級表格元素(具有isHtmlTable的適當定義),但表格單元格內沒有任何表格。

你可以找到給定函數名稱或類型的簽名與HoogleHayoo!


基本的文檔,如果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>

+0

感謝。我已經閱讀過文檔,但我不贊同。例如,(isElem)和(deep isElem)有什麼區別? – Muchin 2010-10-10 07:17:55

+1

@Muchin:'isElem'和'hasName tag'只檢查頂層。 「深」使得這些箭頭遞歸地適用於所有級別。 – kennytm 2010-10-10 07:28:01

+0

比較'深'與'最深'聽起來像'深'應該改爲'淺'。我想這是一個深度優先,但從頂部短路,vs'multi'搜索全部和最深處,開始自下而上? – Mittenchops 2016-12-19 03:27:42