将函数映射到haskell中的列表/数组?

Ano*_*on. 2 arrays haskell functional-programming list

我正在尝试启动随机数组以开始游戏。为此,我创建一个函数randomBoard,该函数返回'*'或''表示游戏板上的空间。

我希望能够使用此功能创建游戏板阵列。我还没有成功实例化一个数组。我希望有一种方法可以声明大小为100的数组并使用我的随机函数设置每个元素。

这显然行不通甚至无法编译。我肯定这有一些问题,因为我不确定如何在Haskell中使用IO并产生这种结果。任何指导都非常感激...

Jos*_*ica 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
Run Code Online (Sandbox Code Playgroud)

这是我更改的内容:

  1. randomBoard :: IO Char为了清楚起见,我添加了类型签名。(如果没有它,代码仍然可以工作,因为如果您不提供它,Haskell会正确推断出该类型。)
  2. 我更改了boardArray使用的类型IO。任何使用的东西,IO无论多么间接,都必须IO本身存在。
  3. 我换listArray (0, 100)listArray (0, 99),因为前者实际上是101元。
  4. map randomBoard $ 100 (0,100)根本不对。要获得多个相同事物的列表,通常可以使用replicate,但是由于您在这里关注的事物位于IOmonad中,因此请replicateM改为使用。replicateM 100 randomBoard给出IO [Char]带有'*'或的100个随机元素的' '
  5. 我添加了一个导入Control.Monad,需要使用replicateM
  6. <$>在中使用boardArray。由于您要listArray使用a 进行调用[Char]并获得一个Array Int Char,但是replicateM 100 randomBoard一个IO [Char],因此您不能直接应用该参数。使用<$>(也称为fmap)将其应用到的“内部” IO,从而向您返回IO (Array Int Char)