什么是修复点?

dfe*_*uer 3 recursion haskell fixpoint-combinators

最近留下匿名的海报试图实现这样的阶乘函数:

f :: Int -> Int
f = fix f
Run Code Online (Sandbox Code Playgroud)

这显然不是很好.但后来我想知道:我能通过类型检查器吗?它的类型将揭示什么?

dfe*_*uer 5

实际上,由于多态递归,它会给出更通用的类型检查:

f :: a
f = fix f
Run Code Online (Sandbox Code Playgroud)

通过参数化,我们可以立即看到它必须是底部,并且根据定义fix,它必须是无限循环而不是异常.

chi 评论道,"出于同样的原因,任何类型的f = bar f任何bar :: F a -> a地方F a(可能依赖于a)都将"起作用".定义如下:

foo :: forall f a .
       (forall b . f b -> b) -> a
foo g = g (foo g)
Run Code Online (Sandbox Code Playgroud)

同样,类型签名是参数性的伪造,因为我可以选择,例如f ~ Identity,在这一点上,很明显第一个参数对于产生结果是无用的.

  • 有趣.出于同样的原因,`f = bar f`将与任何`bar :: F a - > a`"一起工作",其中`F a`是任何类型(可能取决于'a`).例如`proj2 ::(a,a) - > a`.我实际上认为在这里被利用的`fix`并没什么特别之处. (2认同)
  • 关于`fix`,这些也是类型检查:`f3 :: a - > a; f3 =修复f3`和`f4 ::(a - > a) - > a - > a; f4 =修复f4`.多态递归仍然是需要的(当然!),但我觉得有趣的是我们有更多的打字而不是`:: a`(无限多,我猜). (2认同)