繁体   English   中英

如何在Haskell中填充2D阵列

[英]How to populate a 2D Array in Haskell

我目前正在在Haskell中填充定义为type Grid = UArray (Int, Int) Bool其中两个Int分别是x和y坐标。 我正在尝试将其转换为数据类型为布尔值的10 x 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

你可以做一个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)]

更进一步,您可以通过简单地串联和映射== 't'的测试将输入[String]解析为一块板:

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

暂无
暂无

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

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