私は自分のアプリケーションのゲーム状態を表す型を持っています。
Game { points :: Int }
State モナドでゲームロジックを定義します。
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 でほぼ可能に思えますが、mzero を使用して「状態に既にあるものを返す」ことができるかどうかはわかりません。ありがとう!