我有类似的东西,这是有效的:
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
会这样做),这一点非常重要。
答案 0 :(得分:4)
您似乎希望使用类型为iterateUntilM
的{{1}},其中州类型(a -> Bool) -> (a -> m a) -> a -> m a
为a
。那么(Int, MyType)
应该是这样的:
run
然后你可以做
let run (i, p) = fmap (\p' -> (i + 1, p')) (newP p)