Я практикую свои навыки работы с Haskell, пытаясь создать версию Tetris для командной строки. Для игрового поля я использую UArray, так как я могу замораживать и размораживать его, и это позволяет мне увидеть, столкнулся ли текущий элемент тетриса с размещенными в данный момент элементами без поиска по всей доске (что мне нужно было бы сделать, если бы я используемые списки). Я столкнулся с проблемой, что не знаю, как преобразовать этот массив в Text
или String
, чтобы вывести его на консоль.
Пока я работаю только с одной строкой платы, которую я инициализирую следующей функцией:
gameBoardWidth = 10 :: Int
initBoard :: UArray Int Char
initBoard = runSTUArray $ do
let lastCol = gameBoardWidth - 1
row <- newArray (0,lastCol) ' '
return row
Теперь я не уверен, как получить Char
из массива для печати. Из стандартного интерфейса массива elems
выглядит как то, что мне нужно, но это не работает на UArrays
.
*Main Console Lib Paths_haskell_tetris Data.Array> elems initBoard
• Couldn't match expected type ‘Array i0 e’
with actual type ‘Data.Array.Base.UArray Int Char’
Другая идея, которая у меня была, заключалась в том, чтобы попытаться использовать функцию readArray
в блоке do
, но я не уверен, как объединить результат каждой строки на функциональном языке.
На всякий случай, если моя проблема связана с импортированными пакетами, это мой импорт:
import Data.Array.Unboxed
import Data.Array.ST
import Control.Monad
import Control.Monad.ST