Haskell中如何统计嵌套整数列表的总元素个数?
解决Haskell嵌套列表总元素计数的问题
这问题用递归处理简直是量身定做,我来一步步给你讲清楚怎么实现:
第一步:定义嵌套列表的类型
Haskell的原生列表是同构的——里面的元素必须是同一种类型,没法直接表示“列表里既有整数又有子列表”的结构。所以咱们得先自定义一个代数数据类型来描述嵌套列表:
-- 定义嵌套列表:要么是单个元素,要么是嵌套的子列表集合 data NestedList a = Elem a | List [NestedList a]
这里Elem a用来表示单个元素(比如你的例子里的1、2这些整数),List [NestedList a]则表示一个由嵌套列表元素组成的列表。
第二步:写递归计数函数
接下来就可以写递归函数了,核心思路是:
- 如果遇到单个元素,它的“贡献”就是1个计数
- 如果遇到子列表,就把列表里的每个嵌套元素的计数加起来
直接上代码:
totalLength :: NestedList Int -> Int totalLength (Elem _) = 1 -- 单个元素,计数1 totalLength (List xs) = sum (map totalLength xs) -- 递归处理每个子元素,求和
如果想让函数更通用(支持任意类型的元素,不只是Int),可以把类型签名改成:
totalLength :: NestedList a -> Int
毕竟咱们只关心元素的数量,和元素具体是什么类型没关系。
测试你的例子
用你给的输入来测试:
-- 对应输入[[1,2,3],[4,3],[2,1],[5]] testInput :: NestedList Int testInput = List [ List [Elem 1, Elem 2, Elem 3] , List [Elem 4, Elem 3] , List [Elem 2, Elem 1] , List [Elem 5] ] -- 调用函数 main = print $ totalLength testInput -- 输出8,完美符合预期!
递归逻辑的小解释
这个递归的本质是拆解问题:每次把嵌套列表拆成更小的单元,直到拆到最底层的单个元素,然后把所有单元的计数累加起来——完全贴合嵌套列表的结构,非常直观。
内容的提问来源于stack exchange,提问作者James Elkwood
相关产品推荐
相关产品推荐

