繁体   English   中英

在Haskell中打印二维数组

[英]Printing a 2d array in haskell

我正在用这种简单的图像格式(PPM)来打印随机的2d整数数组

0 1 0 0 1
1 0 0 1 0
0 1 1 0 0
0 1 1 1 0
0 0 0 1 0

下面是我的代码,该代码可以正常工作,但是对于这样一个简单的操作,似乎太多了代码。 有一个更好的方法吗?

import System.Random
import Data.Array.IArray

main = do
  g <- newStdGen
  let img = listArray ((0,0),(5,5)) ( myRands g ) :: Array (Int,Int) Int
  putStrLn $ printArray img

myRands :: RandomGen g => g -> [Int]
myRands g = randomRs (0,1) g

make2dRange :: Int -> Int -> Int -> Int -> [(Int,Int)]
make2dRange x1 y1 x2 y2 = range ((x1,y1),(x2,y2))

printArray :: ( Array (Int,Int) Int ) -> String
printArray arr = unlines rows
  where rows = map (unwords . map (show . (!) arr)) rowIndices 
        rowIndices = map ( \y -> make2dRange 0 y 5 y ) [0..5]

当然不是显而易见的(例如,数组维是硬编码的)

我将使用列表推导来操作索引。

printArray arr =
  unlines [unwords [show (arr ! (x, y)) | x <- [0..5]] | y <- [0..5]]

per: http//lambda.haskell.org/platform/doc/current/packages/split-0.2.2/doc/html/Data-List-Split.html#v%3achunksOf

chunksOf :: Int-> [e]-> [[e]]

chunksOf n将列表拆分为长度为n的块。 如果n不平均分割列表的长度,则最后一部分会更短。 如果n <= 0,则chunksOf nl返回一个空列表的无限列表。

使用chunkOf我的实现将..

printArray arr = mapM_ (putStrLn . unwords) $ map (map show) $ chunksOf 5 arr

用法:

Prelude System.Random Data.List Data.List.Split> printArray [0..25]
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
25

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM