什么是修复点?

时间:2016-02-22 14:15:20

标签: haskell recursion

最近离开匿名的海报试图像这样实施阶乘函数:

f :: Int -> Int
f = fix f

这显然没有太好用。但后来我想知道:我能通过类型检查器吗?它的类型将揭示什么?

1 个答案:

答案 0 :(得分:5)

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

f :: a
f = fix f

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

chi comments,“出于同样的原因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) 一起工作'(可能取决于f ~ Identity )”。定义如下:

container.RegisterMany(AssemblySource.Instance.ToArray()
   .SelectMany(Portable.GetAssemblyTypes)
   .Where(type => type.Name.EndsWith("ViewModel"))
   .Where(type => type.GetInterface(ViewModelBaseType.Name, false) != null));

同样,类型签名是参数性的伪造,因为我可以选择,例如InstancePerDependency,此时很明显第一个参数对于产生结果是无用的。