在 1:01:00,对观众问题的回答似乎表明未来的 Scala 不会是图灵完备的。
我是否理解正确? Scala 3 将不再是图灵完备的吗?
不,这既不是被问的问题,也不是被给出的答案。
首先:被问的问题是不是 Scala 是否不会是图灵完备的,被问的问题是Scala 类型系统 是否不会是图灵完备的.
其次:给出的答案是不是未来 Scala 的类型系统不会是图灵完备的。 Martin Odersky 明确表示 with 隐式,类型系统将肯定是图灵完备的,而 没有 隐式,他不想关于它是否是图灵完备的预测。
所以,回答你的问题:
- Scala 肯定仍然是图灵完备的。
- 您链接到的问题不是关于 Scala,而是关于 Scala 的类型系统。
- 由于隐式,Scala 的类型系统仍将是图灵完备的。
- Scala 的类型系统没有隐式可能是图灵完备的,也可能不是图灵完备的,我们还不知道,Martin Odersky 不想做出任何预测。
如果是这样,这对像我这样每天在工作中使用 Scala 解决实际问题的人有什么实际影响?
什么都没有。首先,由于隐含,类型系统仍然是图灵完备的。其次,即使它不是,AFAIK,Scala 类型系统的图灵完备性也没有用于任何实际有趣的事情。有些库确实执行复杂的类型级计算,但这些计算总是终止。没有人编写过在类型级别执行任意图灵完备计算的库。 (事实上,这甚至是不可能的,因为即使 Scala 的类型系统是图灵完备的,但所有当前存在的 Scala 实现(反正只有一个)对类型检查器的递归深度有严格的限制)。
换句话说,工业 Scala 程序员会失去什么,通过移除图灵完备性他们会获得什么?
让我们首先谈谈类型系统:它们不会丢失任何东西。他们获得的是编译可以保证终止的事实,这意味着编译器可以证明它无法证明的程序的东西。
让我们也回答假设的问题:如果 Scala 不是图灵完备的怎么办?好吧,我们不能再写无限循环了。差不多就是这样。但是请注意,许多通常建模为数据上的无限循环(或无限递归)的事物仍然可以建模为协同数据上的有限共同递归! (例如,操作系统、Web 服务器或 GUI 中的事件循环。)
OTOH,编译器不能做的很多事情是“因为它等同于解决停机问题”。好吧,在一种不是图灵完备的语言中,停止问题是不存在的!因此,与图灵完备的语言相比,编译器可以证明更多关于程序的事情。
但是,重申一下:没有计划让 Scala 不具备图灵完备性。没有计划使隐含不是图灵完备的。类型系统存在限制,这些限制可能会或可能不会使类型系统不是图灵完备的。