Language agnostic Scala中的类型系统是图灵完备的。证据?例子?福利?

Language agnostic Scala中的类型系统是图灵完备的。证据?例子?福利?,language-agnostic,scala,type-systems,turing-complete,Language Agnostic,Scala,Type Systems,Turing Complete,有人声称Scala的类型系统是图灵完备的。我的问题是: 这有正式的证据吗 在Scala类型的系统中,一个简单的计算是什么样子的 这对Scala语言有什么好处吗?与没有图灵完整类型系统的语言相比,这是否使Scala在某种程度上更“强大” 我想这通常适用于语言和类型系统。在某个地方有一篇博客文章介绍了SKI combinator演算的类型级实现,这就是众所周知的图灵完备 图灵完备类型系统与图灵完备语言有着基本相同的优点和缺点:你可以做任何事情,但你能证明的很少。特别是,你不能证明你最终会做某事 类型

有人声称Scala的类型系统是图灵完备的。我的问题是:

  • 这有正式的证据吗

  • 在Scala类型的系统中,一个简单的计算是什么样子的

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


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

    在某个地方有一篇博客文章介绍了SKI combinator演算的类型级实现,这就是众所周知的图灵完备

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

    类型级计算的一个例子是Scala 2.8中新的保留类型的收集转换器。在Scala 2.8中,像
    map
    filter
    等方法保证返回调用它们的相同类型的集合。因此,如果
    filter
    a
    Set[Int]
    ,则返回
    Set[Int]
    ,如果
    map
    a
    List[String]
    则返回
    列表[无论匿名函数的返回类型是什么]

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

    someBitSet map { _.toString() }
    
    结果将是一个
    位集[String]
    ,但这是不可能的。因此,Scala选择最派生的
    位集的超类型,它可以保存
    字符串,在本例中是
    集[String]

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

    My在Scala类型系统中对SKI演算进行编码时显示了图灵完整性

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


    最后,Apocalisp的博客上有一篇关于类型级编程的文章。

    我想这就是你要找的博客文章吧。当我第一次看到Scala时,它似乎是一种简洁的语言;超类推断是一个非常酷的特性。答案很好,尽管集合示例有点短。虽然类型检查器确实在做一些有趣的试探,以便在编译时获得最佳的结果集合类型,但它不是类型级计算的一个好例子,因为类型系统本身并没有真正做任何工作。不幸的是(或者说,幸运的是),现实世界中没有太多的代码可以进行实际的类型级编程,这仅仅是因为它太难、太笨重而且无法维护。感谢Jörg提供了一个很好的示例,感谢Daniel的澄清。现在我不敢问类型检查器是否是图灵完整的……我更喜欢一个非通用类型系统和一个快速编译器。@ziggystar如果你在编译速度上获得了什么,那么你可能会在开发和调试时间上失去什么。michid,这看起来令人印象深刻。我保证长大后会好好看看。。。这可能不是一个正式的证据,但它可能属于这个列表@Adrian,唯一已知的图灵完整性的正式证明是实现图灵完整性的其他东西的能力。通常这意味着一个通用图灵机,但即使您使用其他已知的图灵机,如SKI演算、Perl或Javascript,该理论仍然成立。因此,我认为这是一个正式的证明。还应该注意的是,任何实际可实现的东西都不是真正的图灵完备的,因为不可能有无限的内存。即使你用尽了宇宙中所有的物质来构造你的CPU/解释器,它仍然不是图灵完整的。实际上,我们所说的图灵完备实际上是在可用内存范围内的图灵完备。