Haskell如何通过List comprehension创建并扩展tuple元组列表
问题解答
语法可行性说明
你设想的[(a,b) (b,a) | (a,b) <- zip [1..3] [2..4]]写法不符合Haskell的列表推导语法规则:列表推导中竖线|左侧仅支持单个表达式作为每轮迭代的产出值,不能直接并列放置多个元素表达式。
原生列表推导实现方案
无需调用concat的纯列表推导写法如下,通过新增内层生成器完成元素展开:
[ x | (a,b) <- zip [1..3] [2..4], x <- [(a,b), (b,a)] ]
运行输出和你预期的结果完全一致:
[(1,2),(2,1),(2,3),(3,2),(3,4),(4,3)]
这个写法逻辑非常直观:外层生成器遍历得到每一组(a,b)元组,内层生成器依次取出当前元组对应的正序(a,b)和逆序(b,a)两个值,直接追加到最终的结果列表中,比嵌套concat的写法更简洁易读。
内容的提问来源于stack exchange,提问作者Machine Jonte
相关产品推荐
相关产品推荐

