我有一个代表我的应用程序游戏状态的类型,对于这个问题,假设它很简单,例如:
Game { points :: Int }
我用 State monad 定义我的游戏逻辑。
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
...
如果它击中守卫,我希望它独自离开状态,并且在 block 中什么也不做。
我该怎么做?使用 MonadPlus似乎很接近可能,但我不确定我是否可以使用 mzero 来表示“返回你已经拥有的状态”。谢谢!