在Haskell中生成2D网格

时间:2011-06-05 03:01:03

标签: haskell

学习haskell并想要一个函数来生成类似于你在C中的方式的2D网格:

int data[3][3]

什么是可接受的优雅方法?压缩?与foldl?

我可以声明一个像:

x = [[0,0,0],
     [0,0,0],
     [0,0,0]]

但我想要一个带x y参数的函数。努力理解没有for / while循环的最简单方法:(

3 个答案:

答案 0 :(得分:18)

你似乎在问“我应该在Haskell中使用什么而不是Arrays”,对吧?您询问使用列表,这些列表当然不是数组,应该避免任何需要非顺序访问的严重工作(例如,列表提供O(n)元素访问而不是O(1))。

你应该考虑的软件包:数组(旧的,标准的Haskell数组),vector(新的,使用流融合,快速,实际上合理的API,盒装或非盒装,但只有一个维度,除非你嵌套它们),并且修复(仅适用于较新的GHC版本,但即使在未装箱的表示中也允许多维数组和并行操作)。

初始化其中任何一个的最简单方法(我假设你的意思是“初始化”,当你说“生成”时)是它们各自的“fromList”函数。例如:

import Data.Vector as V
...
    V.fromList $ map V.fromList [[01,02,03],[11,12,13],[22,22,23]]

答案 1 :(得分:3)

我会使用一个列表列表(:: [[a]]),可能还有一些新类型,以确保所有列表的长度相等。

要创建包含n值的列表,您可以使用replicate :: Int -> a -> [a],因此要生成列表列表,您只需再次复制列表...

grid :: Int -> Int -> a -> [[a]]
grid x y = replicate y . replicate x

此处,a参数允许您生成任何类型的任何“零”值的列表。这可以这样使用:

> grid 3 3 0
[[0,0,0],[0,0,0],[0,0,0]]
> grid 2 3 False
[[False,False],[False,False],[False,False]]

编辑:这个坐标系使用(y, x)我意识到(我正在考虑(row, column))。您可以在grid中交换x和y以获得“常规”系统。

答案 2 :(得分:3)

如果您希望快速阅读和合理的快速“更新”不太复杂,则应考虑使用Mapimport Data.Map(x,y)对作为键。为范围检查添加辅助函数,并为缺少的条目返回默认值,并且您有一个很好的替换(只要矩阵不是很大)