2

我正在为一个班级写一个棋盘游戏。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
4

1 回答 1

5

这似乎是iterateUntilM。你的函数可以写成:

iterateUntilIO :: (a -> IO a) -> a -> (a -> Bool) -> IO a
iterateUntilIO action state predicate = iterateUntilM predicate action state

这也意味着您可以在代码中简单地iterateUntilIO替换为。iterateUntilM

于 2013-10-02T03:54:23.477 回答