
Tamas K Papp wrote:
f is an a->a function, and there is a stopping rule goOn(a,anext) :: a a -> Bool which determines when to stop. The algorithm looks like this (in imperative pseudocode):
a = ainit
while (true) { anext <- f(a) if (goOn(a,anext)) a <- anext else stop and return anext }
For example, f can be a contraction mapping and goOn a test based on the metric. I don't know how to do this in a purely functional language, especially if the object a is large and I would like it to be garbage collected if the iteration goes on.
The idea is to make the iteration variables arguments to a tail-recursive function: let foo a | goOn a anext = foo anext | otherwise = anext where anext = f a in foo ainit