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
相关产品推荐
相关产品推荐

