我想在Haskell中编写一个游戏,在该游戏中,循环的每次迭代都会计算世界的状态。我以为我应该创建一个函数:

gameLoop :: World -> World
-- ...

并用main :: IO ()调用它:
main = do
    gameLoop -- ...

但是问题是,我对如何包装gameLoop函数缺少一些基本的了解,以便它返回main的参数值。

如何在Haskell中创建游戏循环?

最佳答案

您可能想要这样的东西

import Control.Monad.Loops

main = iterateM_
       (\w -> displayWorld w >> return (gameLoop w))
       initWorld
-- iterateM_ ((>>) <$> displayWorld <*> return . gameLoop) initWorld

或者,如果您不想使用整个monad-loops包(即使它摇晃了)
main = loop initWorld
  where loop w = displayWorld w >> loop (gameLoop w)

基本上,您只是在绘制世界,然后再次循环到下一个状态。

你更有可能想要这样的东西
 -- False when the user wants to exit the game
 keepGoing :: World -> Bool

 main = iterateUntilM_ keepGoing displayLoop initWorld
   where displayLoop w = displayWorld w >> return (gameLoop w)

因为否则你就不能停止:)

10-08 19:48