многократное применение функции до тех пор, пока результат не станет стабильным

Я хочу повторно применить функцию 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
25
задан fredoverflow 16 September 2011 в 10:13
поделиться