我正在为一堂课写棋盘游戏。 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
答案 0 :(得分:5)
这似乎是iterateUntilM
。您的功能可以写成:
iterateUntilIO :: (a -> IO a) -> a -> (a -> Bool) -> IO a
iterateUntilIO action state predicate = iterateUntilM predicate action state
这也意味着您只需在代码中将iterateUntilIO
替换为iterateUntilM
。