修复的固定点:: Eq a =>(a - > a) - > a - > a

Ala*_*yed 1 haskell fixpoint-combinators

大家好我正在尝试实现高阶函数修复,它从初始点计算任意函数的有吸引力的固定f :: a -> ax.也就是说,f?(x)给定f和形式的形式的固定点x.

-- CONTRACT
fix :: Eq a => (a -> a) -> a -> a
-- DEFINITION [TODO: Implement fix]
fix f x  = ?
Run Code Online (Sandbox Code Playgroud)

我目前的尝试是:

fix f x | f x == x = x
        | otherwise = fix f x
    where x = f x
Run Code Online (Sandbox Code Playgroud)

注意:如果函数没有从起点收敛,则函数不会终止.有谁可以帮助我吗 ?我试过但它没有返回任何东西

Wil*_*sem 7

一个常见的误解是,当您编写时x = ...,您在Haskell中分配一个值.在Haskell中,一个没有赋值,一个声明一个.

因此,这意味着,基本上你构建一个变量xwhere条款是不是x在函数的头部,所以是这样的:

fix :: Eq a => (a -> a) -> a -> a
fix f _ | f x == x = x
        | otherwise = fix f x
    where x = f x
Run Code Online (Sandbox Code Playgroud)

因此x,你在这里定义:x = f x,这意味着如果Haskell旨在评估它,它将开始计算f(f(f(f(f(f(...)))))),但没有任何检查是否已达到固定点.

因此,解决方案是引入一个新变量,x2因此使用它如下:

fix :: Eq a => (a -> a) -> a -> a
fix f x | x == x2 = x
        | otherwise = fix f x2
    where x2 = f x
Run Code Online (Sandbox Code Playgroud)

所以这x2是下一个x.鉴于x == x2,我们返回x(或x2),如果没有,我们计算的固定点fx2,所以我们以先进的一步" 任务为固定点 ".

  • 尝试`修复cos 1`找到Dottie号码. (3认同)
  • @Amerov`fix(*2)0`会起作用.或者例如``fix(`div` 2)100``.或者`让collat​​z x | 甚至x = div x 2 | x <= 1 = 1 | 否则=(3*x + 1)`然后`修复collat​​z 99`. (2认同)