Ну, это еще не совсем монадосно.Это главный кандидат на моноид Endo .Это приводит к более элегантному
game = mconcat [ phase1, phase2, ... ]
И каждая фаза написана:
phase1 = Endo $ \game -> ...
Вы бы перешли к монаде, если вам нужно было бы вернуть некоторые дополнительные данные вместе с новым состояниемна каждом этапе.В этом случае простая функция сделает ваш шаблон более терпимым:
phase :: (GameState -> GameMonad a) -> GameMonad a
phase f = f =<< get
И тогда будет написана фаза:
phase1 = phase $ \game -> do ...
Но если вы хотите использовать состояние, вы, вероятно,придется дать ему имя (если вы не можете определить точечность, скажем, с помощью получает или data-accessor ), и в этом случае вы не сможете получить намного более краткие результаты, чемфункция и лямбда.