最近离开匿名的海报试图像这样实施阶乘函数:
f :: Int -> Int
f = fix f
这显然没有太好用。但后来我想知道:我能通过类型检查器吗?它的类型将揭示什么?
答案 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
,此时很明显第一个参数对于产生结果是无用的。