arrays - 在haskell中打印二维数组

标签 arrays haskell printing ppm

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

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]]

关于arrays - 在haskell中打印二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18691321/

相关文章:

.net - .NET可以测试数组的等效性而不仅仅是相等的引用吗?

haskell - 为什么列表仿函数代表不确定性选择的上下文?

asp.net - 如何在asp.net中打印页面的一部分

java - 尝试以数独样式打印二维数组

c# - 以编程方式更改 Windows 中的打印机首选项

c - 在 c 中的结构数组中搜索

c++ - 字符数组不符合新的大小

不同类型的python列表到数组

haskell - 关于 Project Euler 14 的 Haskell 解决方案的问题

multithreading - 为什么 putStrLn 行尾没有线程锁?