2011-05-03 32 views
2

看XXX的下列數據:XML計數TXT

lala XXX = EL String [XXX] 
     | TXT String 
     | MMS String 

爲此,XXX數據<r><r>y</s>pp<s>z</r></r>

lala "r" [ Element "ss" [Text "er"], 
       Text "dd", 
       Element "pp" [Text "tet"] ] 
+0

這基本上是一個稍微更詳細的練習版本,基本上每個Haskell教學源代碼都包含這個練習。 – delnan 2011-05-03 20:00:39

+0

您需要編寫一個模式匹配XML''類型的兩種不同情況的函數,並且在任何也是'XML'類型的子節點上遞歸調用自己... – 2011-05-03 20:04:04

回答

1

所以建成,其基本思路是遍歷樹,並期待用於匹配XML的所有數據構造函數。對於任何Text數據構造函數,我們的函數只返回1,而對於Element數據構造函數,我們的函數只返回所有子列表的總和。因此,它看起來像這樣:

countTags (Element _ list) = 1 + sum $ map countTags list 
countTags _ = 1 

這是基本的解決方案。但它有點低效,因爲它使用了真正的遞歸。一個更好的想法是用手工傳遞一個計數器,並在列表遍歷:

countTag = countTag' 0 where 
    countTag' n (Element _ list) = foldr (flip countTag') (n+1) list 
    countTag' n _ = (n+1) 

我沒有比較了這兩種功能,但是憑直覺,第二應該有更好的表現。

+0

「我們的函數只是返回0對於任何文本數據構造函數「 - 不應該返回1嗎? – LarsH 2011-05-03 20:08:08

+0

啊,我誤解了這個問題。 – fuz 2011-05-03 20:09:56

2

由於這本質上是功課,我會給你提示而不是答案。

Text項目的答案是什麼?用「elemCount(Text _)= ....」的形式寫下來。「

」Element「項目的答案是什麼?把它寫成「elemCount(List _ children)= ...」的形式。「