は、私はこの質問のために、自分のアプリケーションのためのゲームの状態を表しているタイプは、それをふりをしているのような単純なものです。Haskellの出口ステートモナド早く(?ガード)
type GameState a = StateT Game a
addPoints :: Int -> GameState()
addPoints num = do
Game p <- get
put $ Game (p+num)
は、私は単にいくつかの入力
evenResult num = do
Game p <- get
return $ even (p + num)
addPoints num = do
isEven <- evenResult num
if isEven then return() else do
Game n <- get
put $ Game (n+num)
私はそれがガードをヒットした場合、この
addPoints num = do
guard evenResult
...
-- or this
addPoints num = do
guardIsEvenResult
...
ようになります構文をしたいを破棄することができるようにしたい、私はそれをしたいです州だけを残し、ブロックには何もしません。
どうすればいいですか? MonadPlusでをcloseとすることができますが、私はmzeroを使用して "あなたの状態で既に持っているものを返す"と言うことはできません。ありがとう!
'StateT'はすでに' MonadPlus'です。 'Control.Monad.guard'を使ってみましたか? –
@KevinBallard: 'StateT s m'は' m'があれば 'MonadPlus'です。インスタンスは 'mzero'と' mplus'を一レベル上げるだけです。 – ehird
あなたはControl.Monad.when yer manですか?確かに、「Bool」を作る計算ではなく、「Bool」の値が必要なときは迷惑です。しかしローマは一日で焼かれなかった。あなたの 'test'が' m Bool'にある場合、 '(test >> =)と書くことができます。 「$ action」のときにたわごとのような混乱のためにフリップします。 – pigworker