haskell - 带状态参数的 IterateUntil

标签 haskell monads

我正在为类(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/

相关文章:

haskell - 使用构造函数的一部分在 Haskell 数据中派生实例

haskell - Haskell 中的素数

haskell - 尝试组合单子(monad)函数时出错

haskell - `join` 是如何在 Maybe/List monad 中实现的?

Haskell:如果遍历参数,RWS 上的单子(monad)固定点将循环

functional-programming - "bind"可以对 List monad 进行减少吗?

haskell - 达到回跳限制(使用 --max-backjumps 更改)

haskell - 我如何从 haskell 中的函数返回多个值?

Haskell 计算器 - 运算顺序

scala - 在 for-comprehension 中使用不同的 monad