IterateUntil带有状态参数

Tom*_*ens 2 monads haskell

我正在为一堂课写棋盘游戏.Control.Monad.Loops有一个iterateUntil函数,它非常接近我想要的.但是,我想让我的动作采取一个参数(这是本回合的板状态.)所以我的问题是,以下是如何惯用的?我有什么办法可以删除显式递归吗?

iterateUntilIO :: (a -> IO a) -> a -> (a -> Bool) -> IO a
iterateUntilIO action state predicate = if predicate state
                                            then return state
                                            else do
                                                nextState <- action state
                                                iterateUntilIO action nextState predicate
Run Code Online (Sandbox Code Playgroud)

Ell*_*son 5

这似乎是iterateUntilM.您的功能可以写成:

iterateUntilIO :: (a -> IO a) -> a -> (a -> Bool) -> IO a
iterateUntilIO action state predicate = iterateUntilM predicate action state
Run Code Online (Sandbox Code Playgroud)

这也意味着你可以简单地替换iterateUntilIO用iterateUntilM在你的代码.