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