我正在制作一个游戏,我使用纹理。这些纹理从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)
答案 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)
最后,sequence
和map
可以合并到mapM
(也在标准库中):
do
textures <- mapM loadBMP myBMPFiles
display window background (pictures textures)