给定定义,定点组合器并不总是产生正确的答案:
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/