IterateUntil带有状态参数

时间:2013-10-02 03:36:26

标签: haskell monads

我正在为一堂课写棋盘游戏。 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

1 个答案:

答案 0 :(得分:5)

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

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

这也意味着您只需在代码中将iterateUntilIO替换为iterateUntilM