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
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…