Haskell如何不用列表推导式用map实现二维列表转置后转一维
等价实现方案
你给出的列表推导式本质是对n×n方阵先做转置,再按行拼接为一维列表,仅用map加concat的等价实现如下:
concat $ map (\x -> map (\y -> l !! y !! x) [0 .. length l - 1]) [0 .. length l - 1]
逻辑说明
- 原列表推导式的多重生成器逻辑可以拆解为:外层遍历列索引
x,内层遍历行索引y,逐个取l!!y!!x拼接结果,和上述实现逻辑完全对齐 - 内层
map (\y -> l !! y !! x) [0 .. length l - 1]:固定列索引x时,遍历所有行取出对应列的元素,生成转置后的第x行 - 外层
map遍历所有列索引,生成转置后的整个二维列表 - 最后用
concat将嵌套列表拍平为一维列表,和原推导式输出完全一致
验证示例
以方阵l = [[1,2],[3,4]]为例:
- 原推导式输出为
[1,3,2,4] - 上述实现运行后输出结果完全相同
注意:该实现和你给出的原始列表推导式一样,仅适用于行数等于列数、且所有行长度与方阵边长一致的规则方阵,不规则二维列表需要额外补充边界处理逻辑。
内容的提问来源于stack exchange,提问作者NbNb
相关产品推荐
相关产品推荐

