Haskell如何将Turing-completeness添加到System F?

时间:2014-08-12 02:49:30

标签: haskell type-systems lambda-calculus turing-complete system-f

我一直在阅读各种类型系统和lambda结石,我发现lambda多维数据集中所有类型的lambda结石都是强正常化而不是图灵等效。这包括System F,简单类型的lambda演算和多态。

这引出了以下问题,我无法找到任何可理解的答案:

  • (例如)Haskell的形式主义与表面上基于的微积分有何不同?
  • Haskell的哪些语言功能不属于System F形式主义?
  • 允许图灵完整计算所需的最小变化是什么?

非常感谢任何帮助我理解这一点的人。

1 个答案:

答案 0 :(得分:44)

总之,一般递归。

Haskell允许任意递归,而System F没有任何形式的递归。缺乏无限类型意味着fix不能表达为封闭的术语。

没有名称和递归的原始概念。事实上,纯粹的系统F没有任何定义的概念!

所以在Haskell中,这个单一的定义是增加图灵完整性的原因

fix :: (a -> a) -> a
fix f = let x = f x in x

实际上,这个函数表明了一个更为一般的想法,通过完全递归绑定,我们得到了完整性。请注意,这适用于类型,而不仅仅是值。

data Rec a = Rec {unrec :: Rec a -> a}

y :: (a -> a) -> a
y f = u (Rec u)
  where u x = f $ unrec x x

对于无限类型,我们可以编写Y组合子(模数一些展开)并通过它进行一般递归!

在纯粹的系统F中,我们经常会有一些非正式的定义概念,但这些只是简单的简介,需要在心理上完全内联。这在Haskell中是不可能的,因为这会产生无限的术语。

Haskell术语的内核没有 letwhere=的任何概念正在强烈正常化,因为我们没有无限类型。即使这个核心术语微积分也不是系统F.系统F有"大lambdas"或者输入抽象。系统F中id的完整术语是

id := /\ A -> \(x : A) -> x

这是因为系统F的类型推断是不可判定的!我们明确地指出了我们期望多态性的地方和时间。在Haskell中,这样的属性会很烦人,所以我们限制了Haskell的功能。特别是,我们从不推断出没有注释的Haskell lambda参数的多态类型(可能适用条款和条件)。这就是为什么在ML和Haskell

let x = exp in foo

相同
(\x -> foo) exp

即使exp没有递归!这是HM类型推理和算法W的关键,称为"让泛化"。