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

Haskell中如何将嵌套列表转元组并按索引追加计算值

嵌套列表转带索引计算的元组列表实现方案

核心思路

普通map遍历无法直接获取当前元素的索引值,只需要先将原列表与从0开始的自然数列做绑定,让每个子列表和自身索引一一对应,再在映射逻辑中加入索引计算规则即可,原有提取子列表元素的逻辑不需要大改。

修改后完整代码

推荐精简写法,覆盖所有合法输入场景:

tupleInfo :: Num a => [[a]] -> [(a, a)]
-- 处理空列表输入
tupleInfo [] = []
-- 绑定索引后做映射计算
tupleInfo xs = map (\(i, [_, x, y]) -> (x + 15 * i, y)) $ zip [0..] xs

如果要保留你原有代码的分支写法,仅补充索引计算逻辑,可使用如下版本:

tupleInfo [[]] = []
-- 单元素子列表的索引固定为0,补上计算逻辑
tupleInfo [[_,x,y]] = [(x + 15 * 0, y)]
-- 多元素列表先和索引序列压缩,再在映射时加入计算
tupleInfo list = map (\(i, [_,x,y]) -> (x + 15*i, y)) $ zip [0..] list

逻辑说明

  • zip [0..] xs会生成形如(索引, 子列表)的配对序列,索引从0开始计数,完全匹配计算规则
  • 映射lambda调整为接收索引+子列表的元组,提取子列表第二个、第三个元素的逻辑不变,仅在第二个元素的基础上加上15 * 当前索引
  • 原有代码中前两个分支的匹配范围较窄,精简写法删除了冗余分支,对空列表、任意长度的合法嵌套列表都能正确处理

效果验证

使用提供的测试用例输入:
[[43525,3,2],[43615,2,2],[41111,1,2],[74855,5,3]]
逐元素计算过程:

  • 索引0:3 + 15*0 = 3 → 元组(3,2)
  • 索引1:2 + 15*1 = 17 → 元组(17,2)
  • 索引2:1 + 15*2 = 31 → 元组(31,2)
  • 索引3:5 + 15*3 = 50 → 元组(50,3)
    最终输出完全符合预期:[(3,2) , (17, 2), (31, 2), (50, 3)]

内容的提问来源于stack exchange,提问作者Elfi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:42:31