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

如何仅用列表推导式实现Haskell元组列表的展开(不使用concat)

Haskell元组列表的平铺:纯列表推导式实现

首先得说你原来的代码问题出在哪哈:你写的y <- fst(xs)这里有个关键错误——fst(xs)返回的是单个数值(比如元组(1,2)里的1),不是列表,而<-操作符是用来遍历列表这类可枚举容器的,所以这会直接触发类型错误。另外你生成的是[y,z]这种子列表,最后得到的是嵌套列表,不是你想要的平铺结果。

那正确的纯列表推导式写法应该是这样的:

[x | (a, b) <- [(5,6),(7,8),(9,10)], x <- [a, b]]

原理解释:

  1. 首先外层遍历元组列表里的每个元组,把每个元组解构为(a, b);
  2. 对每个解构出的(a, b),我们临时生成一个二元列表[a, b];
  3. 内层遍历这个二元列表,把每个元素x收集到最终的结果列表里。

这样一来,遍历过程就会依次把5、6、7、8、9、10逐个加入结果,完全实现了平铺效果,而且全程没用到concat函数。

你可以测试一下,把上面的代码放到Haskell环境里运行,输入[(5,6),(7,8),(9,10)]的话,输出就是[5,6,7,8,9,10],完全符合你的需求。

内容的提问来源于stack exchange,提问作者B.abyface

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:34:11