dfe*_*uer 3 recursion haskell fixpoint-combinators
最近留下匿名的海报试图实现这样的阶乘函数:
f :: Int -> Int
f = fix f
Run Code Online (Sandbox Code Playgroud)
这显然不是很好.但后来我想知道:我能通过类型检查器吗?它的类型将揭示什么?
实际上,由于多态递归,它会给出更通用的类型检查:
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,在这一点上,很明显第一个参数对于产生结果是无用的.