3

Haskell でゲームを実装しようとしています。スコア、プレイヤー、ラウンドなどを管理する GameState タイプがあります。ラウンドは、ゲームの詳細を管理する RoundState タイプです。ゲームをプレイするには、機能があります

playGame :: (RandomGen g) => State (GameState g) (Player, Int)
playGame = do playRound
              winner <- checkForWinner
              case winner of 
                  Nothing -> playGame
                  Just x -> return x

どこ

checkForWinner :: RandomGen g => State (GameState g) (Maybe (Player, Int))
playRound :: RandomGen (g) => State (GameState g) ()

IO モナドなしでは画面に何も出力できないため、これはあまり興味深いものではありません。

playGame で再帰を維持しながら、この関数を IO モナドでラップするにはどうすればよいですか?

4

1 に答える 1

7

現在、あなたのモナドはただの状態です、いいえIO:

State (GameState g)

必要なのは、状態と IO を持つモナドです。

type Game g = StateT (GameState g) IO

これで、期待どおりにモナドを使用できるようになりました

import Control.Monad.IO.Class (liftIO)

-- ...

playGame :: (RandomGen g) => Game g (Player, Int)
playGame = do
    liftIO $ putStrLn "Look, I have IO"
    winner <- checkForWinner
    ...
于 2013-11-02T22:56:12.003 に答える