学习haskell并想要一个函数来生成类似于你在C中的方式的2D网格:
int data[3][3]
什么是可接受的优雅方法?压缩?与foldl?
我可以声明一个像:
x = [[0,0,0],
[0,0,0],
[0,0,0]]
但我想要一个带x y参数的函数。努力理解没有for / while循环的最简单方法:(
答案 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)
如果您希望快速阅读和合理的快速“更新”不太复杂,则应考虑使用Map
(import Data.Map
)(x,y)
对作为键。为范围检查添加辅助函数,并为缺少的条目返回默认值,并且您有一个很好的替换(只要矩阵不是很大)