Ano*_*on. 2 arrays haskell functional-programming list
我正在尝试启动随机数组以开始游戏。为此,我创建一个函数randomBoard,该函数返回'*'或''表示游戏板上的空间。
我希望能够使用此功能创建游戏板阵列。我还没有成功实例化一个数组。我希望有一种方法可以声明大小为100的数组并使用我的随机函数设置每个元素。
这显然行不通甚至无法编译。我肯定这有一些问题,因为我不确定如何在Haskell中使用IO并产生这种结果。任何指导都非常感激...
这应该为您工作:
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
Run Code Online (Sandbox Code Playgroud)
这是我更改的内容:
randomBoard :: IO Char为了清楚起见,我添加了类型签名。(如果没有它,代码仍然可以工作,因为如果您不提供它,Haskell会正确推断出该类型。)boardArray使用的类型IO。任何使用的东西,IO无论多么间接,都必须IO本身存在。listArray (0, 100)到listArray (0, 99),因为前者实际上是101元。map randomBoard $ 100 (0,100)根本不对。要获得多个相同事物的列表,通常可以使用replicate,但是由于您在这里关注的事物位于IOmonad中,因此请replicateM改为使用。replicateM 100 randomBoard给出IO [Char]带有'*'或的100个随机元素的' '。Control.Monad,需要使用replicateM。<$>在中使用boardArray。由于您要listArray使用a 进行调用[Char]并获得一个Array Int Char,但是replicateM 100 randomBoard一个IO [Char],因此您不能直接应用该参数。使用<$>(也称为fmap)将其应用到的“内部” IO,从而向您返回IO (Array Int Char)。