首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用monads的“迭代直到”

使用monads的“迭代直到”
EN

Stack Overflow用户
提问于 2016-01-06 16:20:24
回答 1查看 212关注 0票数 1

我有这样的东西,正在起作用:

代码语言:javascript
复制
main = do
  let p = something :: MyType
  p' <- newP p
  p'' <- newP p'
  p''' <- newP p''
  print p'''

看到图案了吗?我想重复这一点,直到满足了某个条件,或者直到通过了最大的迭代次数。

我找到了Control.Monad.Loops.iterateUntil,但我不能让它开始工作。下面是我的代码(check看起来类似于这个check :: MyType -> Bool):

代码语言:javascript
复制
main = do
  let p = something :: MyType
  let stopCondition (i, p) = i == 100 || check p
  let run (i, p) = (i + 1, newP p)
  p' <- iterateUntil stopCondition (run (0, p))
  print p'

它甚至不编译。

请注意,每次运行该程序时,run的结果都会传递到下一次迭代(我不确定iterateUntil会这样做),这一点很重要。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-06 16:31:19

看起来,您需要使用iterateUntilM,它的类型为(a -> Bool) -> (a -> m a) -> a -> m a,其中状态类型a(Int, MyType)。那么run应该如下所示:

代码语言:javascript
复制
let run (i, p) = fmap (\p' -> (i + 1, p')) (newP p)

那你就可以

代码语言:javascript
复制
(_, p') <- iterateUntilM stopCondition run (0, p)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34637777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档