【问题标题】:Haskell gloss IO texturesHaskell 光泽 IO 纹理
【发布时间】:2017-11-07 13:55:11
【问题描述】:

我正在制作一个游戏,为此我使用纹理。这些纹理从 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)

【问题讨论】:

  • sequence :: [IO a] -&gt; IO [a]mapM :: (a -&gt; IO b) -&gt; [a] -&gt; IO [b]
  • 谢谢,就像魅力一样

标签: haskell


【解决方案1】:

有一个帮助函数可以让你几乎一路走来:

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

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

您不能在调用 pictures 时使用这个“内部”(因为那是纯 Haskell 代码,无法运行 IO 操作,因此无法获得 [a]),但您可以这样做反过来:

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

使用&gt;&gt;= 将您的函数“推入”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)

【讨论】:

    猜你喜欢
    • 2017-05-14
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 2019-01-21
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多