如何仅用列表推导式实现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]]
原理解释:
- 首先外层遍历元组列表里的每个元组,把每个元组解构为
(a, b); - 对每个解构出的
(a, b),我们临时生成一个二元列表[a, b]; - 内层遍历这个二元列表,把每个元素
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
相关产品推荐
相关产品推荐

