I want to repeatedly apply a function simplify' until the result is "stable" (i.e. simplify'(x) == x):
simplify :: Expr -> Expr
simplify expr =
    let iterations = iterate simplify' expr
        neighbours = zip iterations (tail iterations)
        simplified = takeWhile (\(a, b) -> a /= b) neighbours
    in  snd $ last ((expr, expr) : simplified)
simplify' :: Expr -> Expr
This seems to be a common problem to me. Is there a more elegant solution?
Update: I found a much simpler solution, but I'm still looking for a more elegant solution :)
simplify expr =
    let next = simplify' expr
    in  if next == expr
        then expr
        else simplify next