Arrays 如何获取Haskell UArray的所有元素

Arrays 如何获取Haskell UArray的所有元素,arrays,haskell,functional-programming,io,monads,Arrays,Haskell,Functional Programming,Io,Monads,我正在通过尝试构建俄罗斯方块的命令行版本来练习Haskell技能。对于游戏板,我使用UArray,因为我可以冻结和解冻它,这允许我查看当前俄罗斯方块块是否与当前放置的块发生碰撞,而无需搜索整个板,如果我使用列表,这就是我需要做的。我遇到了这样一个问题:我不知道如何将这个数组转换为文本或字符串以将其输出到控制台 目前,我只使用一排电路板,我使用以下函数初始化该电路板: gameBoardWidth = 10 :: Int initBoard :: UArray Int Char initBoar

我正在通过尝试构建俄罗斯方块的命令行版本来练习Haskell技能。对于游戏板,我使用UArray,因为我可以冻结和解冻它,这允许我查看当前俄罗斯方块块是否与当前放置的块发生碰撞,而无需搜索整个板,如果我使用列表,这就是我需要做的。我遇到了这样一个问题:我不知道如何将这个数组转换为文本或字符串以将其输出到控制台

目前,我只使用一排电路板,我使用以下函数初始化该电路板:

gameBoardWidth = 10 :: Int

initBoard :: UArray Int Char
initBoard = runSTUArray $ do
  let lastCol = gameBoardWidth - 1
  row <- newArray (0,lastCol) ' '
  return row
我的另一个想法是尝试在do块中使用readArray函数,但我不确定如何在函数语言中连接每个字符串的结果

为了防止我的问题与我导入的包有关,以下是我的导入:

import Data.Array.Unboxed
import Data.Array.ST
import Control.Monad
import Control.Monad.ST
您的测试使用Data.Array.elems,它仅在阵列上工作

您需要调用类方法Data.Array.IArray.elems,该类方法适用于任何不可变数组,包括UArray。

您的测试使用Data.Array.elems,该类方法仅适用于数组


您需要调用类方法Data.Array.IArray.elems,该类方法适用于任何不可变数组,包括UArray。

@WillemVanOnsem感谢您的回复。那么,问题是我通过使用runSTUArray将数组从其一元上下文中移除,并且我需要将它放回其上下文中,以便实际读取和写入它?IOUArray和STUArray的区别是什么,它们看起来像是同一个接口,只是它们有不同的内部实现吗?在测试中,您调用的是Data.Array.elems,但看起来您需要调用Data.Array.IArray.elems。也许是进口合格的。。。像可以帮助您指向正确的函数。顺便说一句,不断冻结/解冻阵列是有成本的,因为您需要制作一份拷贝。Willem建议的可变数组应该更具性能,因为它大致相当于我们在命令式语言中得到的数组。@chi如果在GHCI中运行>Data.array.IArray.elems initBoard,则可以工作,这就是我所期望的。由于某种原因,你的回答没有以我可以接受的方式表现出来though@WillemVanOnsem谢谢你的回复。那么,问题是我通过使用runSTUArray将数组从其一元上下文中移除,并且我需要将它放回其上下文中,以便实际读取和写入它?IOUArray和STUArray的区别是什么,它们看起来像是同一个接口,只是它们有不同的内部实现吗?在测试中,您调用的是Data.Array.elems,但看起来您需要调用Data.Array.IArray.elems。也许是进口合格的。。。像可以帮助您指向正确的函数。顺便说一句,不断冻结/解冻阵列是有成本的,因为您需要制作一份拷贝。Willem建议的可变数组应该更具性能,因为它大致相当于我们在命令式语言中得到的数组。@chi如果在GHCI中运行>Data.array.IArray.elems initBoard,则可以工作,这就是我所期望的。由于某种原因,你的回答并没有显示出我可以接受的答案
import Data.Array.Unboxed
import Data.Array.ST
import Control.Monad
import Control.Monad.ST