我正在为类(class)编写棋盘游戏。 Control.Monad.Loops 有一个 iterateUntil 函数,它非常接近我想要的。但是,我想让我的 Action 接受一个参数(这是本回合的棋盘状态)。所以我的问题是,以下内容有多惯用?我可以做些什么来删除显式递归吗?
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
最佳答案
这似乎是iterateUntilM
。你的函数可以写成:
iterateUntilIO :: (a -> IO a) -> a -> (a -> Bool) -> IO a
iterateUntilIO action state predicate = iterateUntilM predicate action state
这也意味着您可以简单地将代码中的 iterateUntilIO
替换为 iterateUntilM
。
关于haskell - 带状态参数的 IterateUntil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19129586/