如何打印Map的数据作为表格?

时间:2012-03-01 22:03:45

标签: haskell

我有一个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等,有人可以给我一个例子如何使用它们吗?

1 个答案:

答案 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
然而,

rowstable并没有轻松定义,所以我就此止步。