【问题标题】:Printing a 2d array in haskell在haskell中打印一个二维数组
【发布时间】:2013-09-12 12:49:05
【问题描述】:

我正在以这种简单的图像格式 (PPM) 打印一个随机的 Ints 二维数组

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]

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

【问题讨论】:

  • 您是否对 2D 数组做任何其他事情,以便您真的需要使用 Array,或者只使用列表的解决方案是否可以接受?

标签: arrays haskell printing ppm


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    每个人: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

    使用 chunksOf 我的实现将是..

    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
    

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 2011-07-07
      • 2013-07-26
      • 2016-02-16
      • 2014-02-25
      • 2014-03-25
      • 1970-01-01
      • 2019-10-24
      相关资源
      最近更新 更多