查看以下XXX数据:
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 :(得分:2)
由于这基本上是家庭作业,我会给你提示而不是答案。
Text项目的答案是什么?将其写成“elemCount(Text _)= ....”
的形式“元素”项目的答案是什么?以“elemCount(List _ children)= ...”
的形式写下来答案 1 :(得分:1)
因此,基本思想是遍历树并查找匹配XML
的所有数据构造函数。我们的函数只为任何Text
数据构造函数返回1,为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)
我没有比较这两个功能,但凭直觉,第二个应该表现得更好。