You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:53:12