[英]Mapping function to list/array in haskell?
我正在尝试启动一个随机数组来开始游戏。 为此,我创建了一个函数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
这是我改变的:
randomBoard :: IO Char
。 (如果没有它,代码仍可以正常工作,因为如果你不提供它,Haskell会正确推断出这种类型。) boardArray
的类型以使用IO
。 任何使用IO
东西,无论多么间接,都需要在IO
本身。 listArray (0, 100)
更改为listArray (0, 100)
listArray (0, 99)
,因为前者实际上是101个元素。 map randomBoard $ 100 (0,100)
根本不对。 要获得相同的几个列表,您通常使用replicate
,但由于您关心的事情是在IO
monad中,因此您使用replicateM
。 replicateM 100 randomBoard
给出一个带有100个'*'
或' '
随机元素的IO [Char]
。 Control.Monad
的导入,这是使用replicateM
所必需的。 boardArray
使用<$>
。 由于你想用[Char]
调用listArray
并得到一个Array Int Char
,但是replicateM 100 randomBoard
是一个IO [Char]
,你不能直接应用这个参数。 使用<$>
(也称为fmap
)将其应用于IO
“内部”,返回IO (Array Int Char)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.