我正在尝试启动随机数组以开始游戏。为此,我创建了一个函数randomBoard,该函数返回'*'或''代表游戏板上的空间。
我希望能够使用此功能创建游戏板阵列。我还没有成功实例化一个数组。我希望有一种方法可以声明一个大小为100的数组,并使用我的随机函数设置每个元素。
这显然行不通甚至无法编译。我肯定这有一些问题,因为我不确定如何在Haskell中甚至与IO一起工作并产生这种结果。任何指导都非常感激...
答案 0 :(得分:7)
这应该对您有用:
import Control.Monad
import System.Random
import Data.Array
import Data.List
randomBoard :: IO Char
randomBoard =
do
f1 <- randomIO :: IO Int
if(f1 `mod` 2) == 0
then return '*'
else return ' '
boardArray :: IO (Array Int Char)
boardArray = listArray (0, 99) <$> replicateM 100 randomBoard
这就是我所做的更改:
randomBoard :: IO Char
。 (如果没有它,代码仍然可以工作,因为如果您不提供它,Haskell会正确推断出这种类型。)boardArray
的类型更改为使用IO
。任何使用IO
的事物,无论多么间接,都必须存在于IO
本身。listArray (0, 100)
更改为listArray (0, 99)
,因为前者实际上是101个元素。map randomBoard $ 100 (0,100)
根本不对。要获得多个相同事物的列表,通常可以使用replicate
,但是由于您在这里关心的事物位于IO
单子中,因此请改为使用replicateM
。 replicateM 100 randomBoard
给出了IO [Char]
,其中包含100个'*'
或' '
的随机元素。Control.Monad
的导入,使用replicateM
才需要。<$>
中使用boardArray
。由于您想用listArray
调用[Char]
并得到Array Int Char
,但是replicateM 100 randomBoard
是IO [Char]
,因此不能直接应用参数。使用<$>
(也称为fmap
)将其应用到IO
的“内部”,并给您返回IO (Array Int Char)
。