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

时间:2019-05-26 23:51:33

标签: arrays list haskell functional-programming

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

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

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

1 个答案:

答案 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

这就是我所做的更改:

  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,但是由于您在这里关心的事物位于IO单子中,因此请改为使用replicateMreplicateM 100 randomBoard给出了IO [Char],其中包含100个'*'' '的随机元素。
  5. 我添加了Control.Monad的导入,使用replicateM才需要。
  6. 我在<$>中使用boardArray。由于您想用listArray调用[Char]并得到Array Int Char,但是replicateM 100 randomBoardIO [Char],因此不能直接应用参数。使用<$>(也称为fmap)将其应用到IO的“内部”,并给您返回IO (Array Int Char)