看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"] ]
看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"] ]
所以建成,其基本思路是遍歷樹,並期待用於匹配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)
我沒有比較了這兩種功能,但是憑直覺,第二應該有更好的表現。
由於這本質上是功課,我會給你提示而不是答案。
Text項目的答案是什麼?用「elemCount(Text _)= ....」的形式寫下來。「
」Element「項目的答案是什麼?把它寫成「elemCount(List _ children)= ...」的形式。「
這基本上是一個稍微更詳細的練習版本,基本上每個Haskell教學源代碼都包含這個練習。 – delnan 2011-05-03 20:00:39
您需要編寫一個模式匹配XML''類型的兩種不同情況的函數,並且在任何也是'XML'類型的子節點上遞歸調用自己... – 2011-05-03 20:04:04