我有这样的东西,正在起作用:
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会这样做),这一点很重要。
发布于 2016-01-06 16:31:19
看起来,您需要使用iterateUntilM,它的类型为(a -> Bool) -> (a -> m a) -> a -> m a,其中状态类型a为(Int, MyType)。那么run应该如下所示:
let run (i, p) = fmap (\p' -> (i + 1, p')) (newP p)那你就可以
(_, p') <- iterateUntilM stopCondition run (0, p)https://stackoverflow.com/questions/34637777
复制相似问题