我有一个Map (Int, Int) a
,其中a
可以是任何类型。基于存储在数组中的Tuple2作为键我想创建一个String表来存储地图的值。
因为Tuple2的最大值是已知的并且可能很大,我首先想到的是创建一个具有默认值的可变2D数组。迭代Map的条目时,可以填充该数组然后打印出来。带有Ints Map的伪代码示例:
map = Map (Int, Int) Int
table = Array.ofDim (maxY, maxX) withDefaultValue 0
for ((x,y), int) <- map do
table[y][x] = int
end
rows = table.rows map toString
str = rows map (toString ++ lineEnd)
print str
唯一的问题是:我不知道如何在Haskell中执行此操作。此外,我不知道这是否是Haskell的首选方式。
我没有找到如何在Haskell中使用2D-Arrays的好例子,因此有人可以给我一个吗?如果有更好的方法可以做到这一点,也许有内置的数据类型,如Table,Matrix,2DStringBuilder等,有人可以给我一个例子如何使用它们吗?
答案 0 :(得分:4)
table = Array.ofDim (maxY, maxX) withDefaultValue 0
可以用
完成table :: Array (Int,Int) Int
table = array ((0,0),(maxX,maxY))
[((i,j),Map.findWithDefault 0 (i,j) map) | i <- [0 .. maxX], j <- [0 .. maxY]]
然后是任何二维数组的表格输出,
rows :: Array (Int,Int) a -> [[a]]
rows arr = [[arr ! (r,c) | c <- [clow .. chigh]] | r <- [rlow .. rhigh]]
where
((rlow,clow),(rhigh,chigh)) = bounds arr
rowStrings :: Show a => Array (Int,Int) a -> [String]
rowStrings arr = [unwords (map show row) | row <- rows arr]
tableString :: Show a => Array (Int,Int) a -> String
tableString arr = unlines (rowStrings arr)
prettyPrint :: Show a => Array (Int,Int) a -> IO ()
prettyPrint arr = putStr (tableString arr)
你也可以定义一些无点的功能,
prettyPrint = putStr . tableString
tableString = unlines . rowStrings
rowStrings = map (unwords . map show) . rows
然而, rows
和table
并没有轻松定义,所以我就此止步。