npo*_*cop 25 polymorphism haskell type-systems
let a = b in c可以被认为是一种语法糖(\a -> c) b,但在一般的打字环境中并非如此.例如,米尔纳微积分let a = \x -> x in (a True, a 1)是典型的,但看似等价(\a -> (a True, a 1)) (\x -> x)的不是.
但是,后者在系统F中是典型的,第一个lambda的等级为2.
我的问题是:
让多态性成为在米尔纳微积分的其他排名1世界中偷偷潜入的2级特征?
具有单独let构造的目的似乎指定哪些类型应该由类型检查器推广,哪些不是.它是否有任何其他用途?是否有任何理由扩展更强大的系统,例如系统F与单独let的不是糖?有没有关于米尔纳微积分设计背后的理由的论文,这对我来说似乎不再明显?
\a -> (a True, a 1)System F中是否有最常用的类型?
是否在beta扩展下关闭了类型系统?即如果P是典型的并且MN = P那么M是典型的吗?
一些澄清:
等价是指等价模数型注释.'System F a la Church'是正确的术语吗?
我知道一般来说,主要的输入属性不能保存在F中,但是我的特定术语可能存在主体类型.
通过let我的意思的非递归的味道let.使用递归let扩展系统F显然是有用的,因为它允许非终止.
Ste*_*ans 17
问四个问题:
在这个问题上的一个关键见解是,我们输入一个(含糖的)抽象,而不仅仅是键入一个带有潜在多态参数类型的lambda抽象,这个抽象是(1)只应用一次,而且,(2)应用于一个静态知名的论点.也就是说,我们可以首先对"参数"(即本地定义的定义)进行类型重构以找到其(多态)类型; 然后将找到的类型分配给"参数"(定义); 然后,最后,在扩展类型上下文中键入正文.
请注意,这比一般的rank-2类型推断要容易得多.
请注意,严格来说,如果你要求定义带有一个类型注释,那么.. :: .. in ..只是系统F中的语法糖:let ..:.. = .. in ..
以下是系统F中的T in(\ a :: T - >(a True,a 1))的两个解决方案:forall b.(forall a.a - > b) - >(b,b)和forall c d.(forall a b.a - > b) - >(c,d).请注意,它们中的任何一个都不比另一个更通用.通常,System F不承认主要类型.
我认为这适用于简单类型的lambda演算?