【发布时间】:2011-11-18 13:32:37
【问题描述】:
我想重复应用一个函数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
【问题讨论】:
-
我只写一个简单的递归函数。
-
“修复”是否适用于此?看来您正在寻找一个固定点。
-
@Tim:也许吧,但是
fix的文档让我大吃一惊。 -
@FredOverflow 我想为您指出正确的方向,但我对 Haskell 知之甚少。两个症结似乎是你需要一个惰性函数来修复收敛,并且它收敛到“最少定义”的固定点。不过,我不确定其中任何一个会如何影响您的情况。
-
@Tim:
fix找到 a different kind of fixed point。
标签: function haskell repeat higher-order-functions