2012-03-01 25 views
0

我有一個Map (Int, Int) a其中a可以是任何類型。基於存儲在數組中的Tuple2作爲鍵我想創建一個存儲地圖值的String表。如何將Map的數據打印爲表格?

因爲Tuple2的最大值是已知的並且可能很大,所以我的第一個想法是創建一個具有默認值的可變2D數組。在迭代Map的條目時,可以填充該數組然後打印出來。帶有Map of Ints的僞代碼示例:

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數組,因此有人能給我一個嗎?如果有更好的方法來做到這一點,也許有一個內置的數據類型,如表,Matrix,2DStringBuilder等,有人可以告訴我一個例子如何使用它們?

回答

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 

儘管如此,0和table沒有舒適的定義,所以我在這裏停下來。

+0

通過不構建數組並在地圖中執行查找而不是索引到數組中,這同樣適用(儘管可能更慢)。 – augustss 2012-03-02 08:10:22