在System Fàla Church中,我们可以自动为所有消除类型推断吗?


9

问题如下。通常,当一个词有ΛX.t,我们可以通过消除FORALL 适用这个词的类型,为实例(ΛX.t)[T]t[X:=T]

现在,假设这是一个箭头,并且我们想给它一个参数,那么我们将需要将此术语应用于适当的类型,以便它可以接收这样的参数。这就是我要问的问题:是否可以构造一个函数f 取两个词并返回一个类型 f<ΛX.t><r> 给我们需要替换的类型 Xt 这样 t 可以接受论点 r

一些例子:

  • f<ΛX.λxXX.t><λxT.x>=T

  • f<ΛX.λxX.r><(λxR.tT) s>=T


2
如果您不将参数f作为子/上标(每个子/上标都包含其他子/上标),则问题的可读性会更高。
戴夫·克拉克

供参考:这种问题是“本地类型推断”(dl.acm.org/citation.cfm?id=345100)解决的两个问题之一。同样相关的应该是dl.acm.org/citation.cfm?id=1086383
布莱布莱德(Blaisorblade)'16

Answers:


8

我不确定我是否已经理解了这个问题。首先,我尝试将您的问题简化为以下统一问题:

给定系统F,类型τ(X)带有自由(类型)变量X和类型σ。
是否可以找到类型γ使得τ(γ)=σ?

这是用于解决此问题的伪代码(当无法统一时会引发异常)。

unify (X, σ) = σ
unify (Y, Y) = Y
unify (τ₁ → τ₂, σ₁ → σ₂) = unify(τ₁,σ₁) → unify(τ₂,σ₂)
unify (∀Y.τ(Y), ∀Y.σ(Y)) = ∀Y.unify(τ(Y),σ(Y)) (with Y a fresh variable)
unify (_,_) = raise Not_unifiable

您可以(通过归纳法)证明γ=τ(unify(τ(X),σ)仅在未引发异常的情况下有效。

现在针对您的问题,您可以采取

f (ΛX.t) (r) = match type of t with "τ₁ → τ₂" => unify (τ₁, type of r) | _ => fail end

(当然,如果您的条件是开放的,则函数f应该将上下文作为参数)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.