有人声称Scala的类型系统是Turing完整的。我的问题是:
是否有正式的证据?
如何在Scala类型系统中进行简单的计算?
这对Scala有什么好处 - 语言?与没有图灵完整类型系统的语言相比,这是否使得Scala在某种程度上更“强大”?
我想这通常适用于语言和类型系统。
答案 0 :(得分:36)
有一篇博客文章,其中包含SKI组合子微积分的类型级实现,已知它是Turing-complete。
图灵完整型系统具有与图灵完整语言基本相同的优点和缺点:你可以做任何事情,但你可以证明很少。特别是,你无法证明你最终会做某事。类型级计算的一个例子是Scala 2.8中新的类型保留集合变换器。在Scala 2.8中,map
,filter
等方法保证返回与调用它们相同类型的集合。因此,如果您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类型级编程。