haskell - Haskell 中的定点组合器

标签 haskell fixpoint-combinators fixed-point-iteration

给定定义,定点组合器并不总是产生正确的答案:

fix f = f (fix f)

以下代码不会终止:
fix (\x->x*x) 0

当然,fix不能总是产生正确的答案,但我想知道,这可以改进吗?

当然对于上面的例子,可以实现一些看起来像的修复
fix f x | f x == f (f x)  = f x
        | otherwise       = fix f (f x)

并给出正确的输出。

不使用上述定义(或者更好的定义,因为这个只处理带有 1 个参数的函数)的原因是什么?

最佳答案

定点组合器找到函数的最小定义固定点,在您的情况下是 ⊥ (非终止确实是未定义的值)。

你可以检查一下,在你的情况下

(\x -> x * x) ⊥ = ⊥

确实是 \x -> x * x 的不动点.

至于为什么是fix以这种方式定义:fix 的要点就是让你使用anonymous recursion为此,您不需要更复杂的定义。

关于haskell - Haskell 中的定点组合器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8099349/

相关文章:

haskell - 获取运行时的线程数 (HEC)

haskell - 无法理解相互递归

haskell - 需要帮助理解 Haskell 中的 Fix 类型

haskell - 为什么这个定点计算不停止?

haskell - "closed under composition"的含义

haskell - Haskell 应用变压器的例子

c++ - 如何优雅地找到一个简单的mod函数的固定点?

haskell - 如何在haskell中编写定点函数

scala - 不动点理论和 isGoodEnough 函数