Scala中的类型系统是图灵完整的。证明?例?好处?

时间:2010-10-28 22:02:17

标签: language-agnostic scala type-systems turing-complete

有人声称Scala的类型系统是Turing完整的。我的问题是:

  1. 是否有正式的证据?

  2. 如何在Scala类型系统中进行简单的计算?

  3. 这对Scala有什么好处 - 语言?与没有图灵完整类型系统的语言相比,这是否使得Scala在某种程度上更“强大”?

  4. 我想这通常适用于语言和类型系统。

2 个答案:

答案 0 :(得分:36)

有一篇博客文章,其中包含SKI组合子微积分的类型级实现,已知它是Turing-complete。

图灵完整型系统具有与图灵完整语言基本相同的优点和缺点:你可以做任何事情,但你可以证明很少。特别是,你无法证明你最终会做某事。

类型级计算的一个例子是Scala 2.8中新的类型保留集合变换器。在Scala 2.8中,mapfilter等方法保证返回与调用它们相同类型的集合。因此,如果您filter Set[Int],则返回Set[Int],如果map List[String],则返回List[Whatever the return type of the anonymous function is]。< / p>

现在,正如您所看到的,map实际上可以转换元素类型。那么,如果新元素类型无法用原始集合类型表示会发生什么?示例:BitSet只能包含固定宽度的整数。那么,如果你有一个BitSet[Short]并将每个数字映射到它的字符串表示,会发生什么?

someBitSet map { _.toString() }

结果成为BitSet[String],但这是不可能的。因此,Scala选择BitSet的派生最多的超类型,它可以包含String,在这种情况下是Set[String]

所有这些计算都是在编译时期间进行的,或者更准确地说是在类型检查时期间,使用类型级函数。因此,静态保证它是类型安全的,即使这些类型是实际计算的,因此在设计时也不知道。

答案 1 :(得分:33)

我在Scala类型系统中编码SKI演算的blog post显示图灵完整性。

对于一些简单的类型级别计算,还有一些关于如何编码自然数和加法/ multiplication的例子。

最后,在Apocalisp的博客上有一个很棒的series of articles类型级编程。