Haskell中的列表可能如下所示:
data List a = Nil | Cons a (List a)
类型理论解释是:
λα.μβ.1+αβ
将列表类型编码为仿函数的固定点。在Haskell中可以表示:
data Fix f = In (f (Fix f))
data ListF a b = Nil | Cons a b
type List a = Fix (ListF a)
我很好奇早期的μBinder的范围。外部作用域中绑定的名称是否仍可在内部作用域中使用?比如,以下是一个有效的表达式:
μγ.1+(μβ.1+γβ)γ
......也许它与:
相同μβ.μγ.1+(1+γβ)γ
...但是当重复使用名称时,情况会如何变化:
μβ.μγ.1+(μβ.1+γβ)γ
以上都是常规类型吗?
答案 0 :(得分:9)
您的μ
类型表达式有效。我相信你的类型也是常规的,因为你只使用递归,求和和产品。
类型
T1 = μγ.1+(μβ.1+γβ)γ
看起来不等于
T2 = μβ.μγ.1+(1+γβ)γ
因为inr (inr (inl *, inr (inl *)), inl *)
有第二种类型而不是第一种类型。
最后一种
T3 = μβ.μγ.1+(μβ.1+γβ)γ
等于(α转换第一个β)
μ_.μγ.1+(μβ.1+γβ)γ
即展开顶级μ,
μγ.1+(μβ.1+γβ)γ
是T1
。
基本上,μ-约束变量的范围遵循相同的λ-约束变量规则。也就是说,变量β
每次出现的值都由最近的 μβ
提供。
答案 1 :(得分:8)
μ的范围与其他绑定器没有区别,所以是的,所有示例都是有效的。它们也是常规的,因为它们甚至不包含λ。 (*)
至于平等,这取决于你拥有的μ类型。基本上有两种不同的概念:
equi-recursive :在这种情况下,输入规则假定等价
μα.T= T [μα.T/α]
即,递归类型被认为等于其单级“展开”,其中μ被移除并且μ-约束变量被类型本身替换(并且因为该规则可以重复应用,所以可以展开任意多次)。
iso-recursive :在这里,不存在这样的等价。相反,μ型是一种单独的类型形式,具有自己的表达形式以引入和消除它 - 它们通常被称为滚动和展开(或折叠和展开),并且键入如下:
roll:T [μα.T/α]→μα.T
展开:μα.T→T [μα.T/α]
这些必须明确应用于术语级别以反映上述等式(每次展开一次)。
ML或Haskell等函数式语言通常使用后者来解释数据类型。但是,roll / unroll内置于数据构造函数的使用中。所以每个构造函数都注入一个iso-recursive类型,注入一个sum类型(当匹配时反向)。
你的例子在iso-recursive解释下都是不同的。在等效递归解释下,第一个和第三个是相同的,因为当你应用上述等价时外部μ就会消失。
(*)编辑:不规则递归类型是无限扩展与常规树不对应的类型(或等效地,不能用有限循环图表示)。这种情况只能用递归类型构造函数表示,即在aμ下发生的λ。例如,μα.λβ.1+α(β×β) - 对应于递归方程t(β)= 1 + t(β×β) - 将是不规则的,因为递归类型构造函数α被递归地应用对于比其参数“更大”的类型,因此每个应用程序都是一个无限期“增长”的递归类型(因此,您无法将其绘制为图形)。
然而,值得注意的是,在μ的大多数类型理论中,其约束变量仅限于地面类型,因此根本不能表达不规则类型。特别是,具有不受限制的等递归类型构造函数的理论将具有非终止类型规范化,因此类型等价(因此类型检查)将是不可判定的。对于iso-recursive类型,你需要更高阶的滚动/展开,这是可能的,但我不知道有很多文献在研究它。