Я хочу повторно применить функцию 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