Я хочу многократно применять функцию simplify'
до тех пор, пока результат не станет "стабильным" (т.е. 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
Мне кажется, это общая проблема. Есть ли более элегантное решение?
Обновление: я нашел намного более простое решение, но я все еще ищу более элегантное решение:)
simplify expr =
let next = simplify' expr
in if next == expr
then expr
else simplify next