在Haskell中生成更高维度的列表
我写了一个 Haskell 函数来生成一个元组列表。
defineIndices :: Int -> Int -> [(Int,Int)]
defineIndices n m = [(i,j) | i <- [1..n], j <- [1..m]]
该函数具有以下行为。
?> defineIndices 2 3
[(1,1),(1,2),(1,3),(2,1),(2,2),(2,3)]
事实证明,我需要的功能如下:
?> defineIndices2D 2 3
[[(1,1),(1,2),(1,3)],[(2,1),(2,2),(2,3)]]
其中,defineIndices2D 返回维度为 n*m 的 (Int,Int) 列表。我有点卡在这里,我想知道如何更改我现有的解决方案以生成更高阶的列表。
我的最终目标是生成一个 x,y 索引列表,用作 Data.Map Map 中值的键。
回答
您可以嵌套列表理解,从而创建一个外部列表理解,它将枚举 的值m,并且您每次都会生成一个使用另一个列表理解表达式生成的列表:
defineIndices2D :: Int -> Int -> [[(Int,Int)]]
defineIndices2D n m = [ [(i,j) | j <- [1..m]] | i <- [1..n]]
对于 2×3 网格,这将产生:
Prelude> defineIndices2D 2 3
[[(1,1),(1,2),(1,3)],[(2,1),(2,2),(2,3)]]