Haskell在模式匹配中的多个动作

时间:2017-11-12 18:29:32

标签: haskell

对于我想要使用动画的游戏,我想从列表中选择一张图片,然后转到下一张图片。但是,为此,我需要在一个函数中做两件事,这是我想不到的。

getPicture :: [IO Picture] -> Int -> IO Picture
getPicture a i | i < length a = (!!) i a && getPicture a (i+1)
               | otherwise    = (!!) i a && getPicture a (0)

显然我不能使用&&继续下一部分,但我想知道是否有可能这样做?

1 个答案:

答案 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

当然,我只是猜测你真正想要的东西。例如,这会将所有图片(帧?)保存在内存中。