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 类型。
我的问题是:
let
的目的构造似乎指定了哪些类型应该由类型检查器概括,哪些不是。它还有其他用途吗?是否有任何理由扩展更强大的系统,例如系统 F 带有单独的 let
哪个不是糖?是否有任何关于米尔纳微积分设计背后原理的论文对我来说似乎不再明显? \a -> (a True, a 1)
有没有最通用的类型在系统 F 中? 一些澄清:
let
我的意思是 let
的非递归风格.使用递归 let 扩展系统 F 显然很有用,因为它允许不终止。 最佳答案
W.r.t.对于提出的四个问题:
具有潜在多态参数类型的 lambda 抽象,我们
正在键入(1)只应用一次的(加糖的)抽象
而且,即 (2) 应用于静态已知参数。
也就是说,我们可以首先将“论据”(即
本地定义)类型重建以找到它的
(多态)类型;然后将找到的类型分配给“参数”
(被定罪);然后,最后,在扩展中键入正文
类型上下文。
请注意,这比一般 rank-2 类型容易得多
推理。
关于haskell - Milner 是否让多态性成为 2 级特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8296695/