"迭代直到"与monads

时间:2016-01-06 16:20:25

标签: haskell

我有类似的东西,这是有效的:

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):

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会这样做),这一点非常重要。

1 个答案:

答案 0 :(得分:4)

您似乎希望使用类型为iterateUntilM的{​​{1}},其中州类型(a -> Bool) -> (a -> m a) -> a -> m aa。那么(Int, MyType)应该是这样的:

run

然后你可以做

let run (i, p) = fmap (\p' -> (i + 1, p')) (newP p)