Haskell光泽IO纹理

时间:2017-11-07 13:55:11

标签: haskell

我正在制作一个游戏,我使用纹理。这些纹理从BMP文件加载到Gloss中,并提供IO图片。

现在我有一个IO图片列表,我想渲染。渲染图片,您可以将多张图片合成一张图片

现在

Render :: IO()
texture1 <- loadBMP "D:/t1.bmp"

display window background (pictures [translate 10 50 $ texture1])

但是,我想使用纹理列表。因为这适用于较小的数字,但它变得太多了100个纹理。

现在出于某种原因,图片功能,它需要图片,现在可以使用IO,我相信这与do有关。

我的问题是,有没有办法把它变成一个函数?如果它都是Picture,那将很容易,但由于IO Picture,我不知道该怎么做

类似

func :: [IO Picture] -> [?]
func [] = []
func (x:xs) =  do
               x' <- x
               x' ++ func xs

然后

 display window background (pictures func)

1 个答案:

答案 0 :(得分:3)

有一个辅助功能可以让你几乎到达那里:

sequence :: [IO a] -> IO [a]

即。它将一组IO动作组合成一个动作(运行时)返回结果列表。

您无法使用此内容&#34;内部&#34;对pictures的调用(因为那个纯粹的Haskell代码,它无法运行IO操作,因此无法获得[a]),但是你可以用另一种方式做到:

(>>=) :: IO a -> (a -> IO b) -> IO b

使用>>=将您的功能推送到&#34; IO:

sequence (map loadBMP myBMPFiles) >>= (\textures -> display window background (pictures textures))

(顺便说一句,我假设你在这里有一个名为myBMPFiles的文件名列表。)

也可以使用do表示法编写相同的代码:

do
    textures <- sequence (map loadBMP myBMPFiles)
    display window background (pictures textures)

最后,sequencemap可以合并到mapM(也在标准库中):

do
    textures <- mapM loadBMP myBMPFiles
    display window background (pictures textures)