如何在Haskell中填充2D数组

时间:2015-10-12 20:03:27

标签: arrays haskell get set

我目前正致力于在Haskell中填充定义为type Grid = UArray (Int, Int) Bool的网格,其中两个Int是x和y坐标。我试图将其转换为10×10数据结构,其中数据类型为布尔值。我可以得到这样的值listArray是Data.Array.Unboxed

的一部分
import System.IO
import Control.Monad
import Data.Array.Unboxed
import Data.List (unfoldr)
type Board = UArray (Int, Int) Bool
progress :: Int -> Int -> Board -> Board
progress  width height previous = 
    listArray b (map f (range b))
  where b@((y1,x1),(y2,x2)) = bounds previous
  -- some basic math functions performed here

total :: [Bool] -> Int
total = length . filter id

board :: [String] -> (Int, Int, Board)
board l = (width, height, a)
  where (width, height) = (length $ head l, length l)
        a = listArray ((1, 1), (height, width)) $ concatMap f l
        f = map g
        g 'f' = False
        g _   = True

printGrid :: Int -> Board -> IO ()
printGrid width = mapM_ f . split width . elems
  where f = putStrLn . map g
        g False = 'f'
        g _     = 't'

split :: Int -> [a] -> [[a]]
split n = takeWhile (not . null) . unfoldr (Just . splitAt n)

-- used only as a test trying to create same structure programatically
testBoard = board
   ["ffffffffff",
   "ffffffffff",
   "ffffffffff",
   "ffffffffff",
   "ffffffffff",
   "ffffffffff",
   "ffffffffff",
   "ffffffffff",
   "ffffffffff",
   "ffffffffff"]

printProgress :: Int -> (Int, Int, Board) -> IO ()
printProgress n (width, height, g) = mapM_ f $ take n $ iterate (progress width height) g
  where f g = do
            putStrLn "------------------------------"
            printGrid width g

main :: IO ()
main = do
    printProgress times testBoard

1 个答案:

答案 0 :(得分:1)

您可以使用UArray功能或array功能制作listArray。第一个需要一个索引和元素列表,而第二个需要一个指示索引范围的元组和一个自动与索引配对的元素列表(词典顺序)。

Data.Array.Unboxed> listArray ((0,0), (9,9)) (replicate 100 False) :: UArray (Int,Int) Bool
array ((0,0),(9,9)) [((0,0),False),((0,1),False),((0,2),False),((0,3),False),((0,4),False),((0,5),False),((0,6),False),((0,7),False),((0,8),False),((0,9),False),((1,0),False),((1,1),False),((1,2),False),((1,3),False),((1,4),False),((1,5),False),((1,6),False),((1,7),False),((1,8),False),((1,9),False),((2,0),False),((2,1),False),((2,2),False),((2,3),False),((2,4),False),((2,5),False),((2,6),False),((2,7),False),((2,8),False),((2,9),False),((3,0),False),((3,1),False),((3,2),False),((3,3),False),((3,4),False),((3,5),False),((3,6),False),((3,7),False),((3,8),False),((3,9),False),((4,0),False),((4,1),False),((4,2),False),((4,3),False),((4,4),False),((4,5),False),((4,6),False),((4,7),False),((4,8),False),((4,9),False),((5,0),False),((5,1),False),((5,2),False),((5,3),False),((5,4),False),((5,5),False),((5,6),False),((5,7),False),((5,8),False),((5,9),False),((6,0),False),((6,1),False),((6,2),False),((6,3),False),((6,4),False),((6,5),False),((6,6),False),((6,7),False),((6,8),False),((6,9),False),((7,0),False),((7,1),False),((7,2),False),((7,3),False),((7,4),False),((7,5),False),((7,6),False),((7,7),False),((7,8),False),((7,9),False),((8,0),False),((8,1),False),((8,2),False),((8,3),False),((8,4),False),((8,5),False),((8,6),False),((8,7),False),((8,8),False),((8,9),False),((9,0),False),((9,1),False),((9,2),False),((9,3),False),((9,4),False),((9,5),False),((9,6),False),((9,7),False),((9,8),False),((9,9),False)]

更进一步,您可以通过简单地连接并映射[String]的测试来将您的输入== 't'解析为一个板:

stringsToGrid :: [String] -> Grid
stringsToGrid = listArray ((0,0), (9,9)) . map (== 't') . concat