对于我想要使用动画的游戏,我想从列表中选择一张图片,然后转到下一张图片。但是,为此,我需要在一个函数中做两件事,这是我想不到的。
getPicture :: [IO Picture] -> Int -> IO Picture
getPicture a i | i < length a = (!!) i a && getPicture a (i+1)
| otherwise = (!!) i a && getPicture a (0)
显然我不能使用&&
继续下一部分,但我想知道是否有可能这样做?
答案 0 :(得分:0)
看到你总是以递归方式呼叫getPicture
,我觉得你只是想按顺序排列所有照片。您还有一个基本案例可以追溯到第一张图片。你认为getPictures :: [IO Picture] -> IO [Picture]
看起来不是更合适的签名吗?它只会按顺序获取所有图片,无需手动跟踪i
。
幸运的是sequence
来自Control.Monad
的{{1}}可以为您做到这一点。我们会投入cycle
来容纳&#34;回到开头#34;一部分。
do
pictures <- cycle <$> sequence getPictures
… -- animate the pictures as you wish
当然,我只是猜测你真正想要的东西。例如,这会将所有图片(帧?)保存在内存中。