我读到过,Scala 的类型系统因 Java 互操作性而被削弱,因此无法执行与 Haskell 类型系统相同的某些功能。这是真的?弱点是因为类型擦除,还是我在各方面都错了?这种差异是 Scala 没有类型类的原因吗?

有帮助吗?

解决方案

最大的区别是 Scala 没有 Hindley-Milner 全局类型推断,而是使用局部类型推断的形式,要求您​​指定方法参数的类型以及重载或递归函数的返回类型。

这不是由类型擦除或 JVM 的其他要求驱动的。这里所有可能的困难都可以克服,而且已经克服了,只要考虑一下贾斯克尔—— http://docs.codehaus.org/display/JASKELL/Home

H-M 推理在面向对象的上下文中不起作用。具体来说,当使用类型多态性时(与类型类的临时多态性相反)。这对于与其他 Java 库的强大互操作性以及(在较小程度上)从 JVM 获得最佳的优化至关重要。

说 Haskell 或 Scala 具有更强的类型系统并不是真的有效,只是它们不同而已。这两种语言都在不同的方向上突破了基于类型的编程的界限,并且每种语言都具有其他语言难以复制的独特优势。

其他提示

Scala的类型系统与Haskell的类型系统不同,尽管Scala的概念有时直接受Haskell的优势及其知识渊博的研究人员和专业人士社区的启发。

当然,首先运行不用于功能编程的VM运行会引起与针对此平台的现有语言的一些兼容性问题。因为大多数关于类型的推理都在编译时发生,所以Java(作为一种语言和平台)在运行时的局限性没有什么可关注的(type Erasure除外,虽然此错误似乎使集成到Java中生态系统更无缝)。

据我所知,使用Java的类型系统级别上唯一的“妥协”是处理原始类型的特殊语法。虽然Scala甚至不再允许RAW类型,但它接受了使用该错误的较旧的Java类文件。也许您已经看到了像 List[_] (或等效较长 List[T] forSome { type T })。这是与Java的兼容性功能,但在内部也被视为一种存在类型,并且不会削弱类型系统。

Scala的类型系统确实支持 类型类, ,虽然比哈斯克尔更详细。我建议阅读本文,这可能会对Scala类型系统的相对强度产生不同的印象(第17页上的表是非常强大的类型系统概念的不错列表)。

不一定与类型系统的功能有关的是Scala和Haskell的编译器用于推断类型的方法,尽管它对人们编写代码的方式有一定影响。拥有强大的类型推理算法可以使编写更多抽象代码值得(您可以决定在所有情况下都是一件好事)。

最终,Scala和Haskell的类型系统是由向用户提供解决问题的最佳工具的愿望所驱动的,但已采取不同的途径。

要考虑的另一个有趣的点是,Scala直接支持经典的OO风格。这意味着,有 亚型 关系(例如,列表是SEQ的子类)。这会使类型推断更加棘手。再加上您可以在Scala中混合特征的事实,这意味着给定类型可以具有多种超级型关系(使其更加棘手)

Scala没有 rank-n类型, ,尽管有可能 围绕此限制 在某些情况下。

我对Haskell只有很少的实验,但是我注意到的是,Scala类型系统与Haskell不同的是类型推理。

在Scala中,没有全局类型的推理,您必须明确说明函数参数的类型。

例如,在Scala中,您需要编写以下内容:

def add (x: Int, y: Int) = x + y

代替

add x y = x + y

当您需要使用各种类型的添加函数的添加函数的通用版本时,这可能会导致问题。有一个解决方法,但它将获得更多的详细信息。

但是实际使用时,我发现Scala的类型系统足以用于日常使用,而且我几乎从不将这些方法用于通用,也许这是因为我来自Java World。

明确声明参数类型不是必需的限制,无论如何您都需要文档。

他们还可以还原图灵吗?

请参阅Oleg Kiselyov的页面 http://okmij.org/ftp/...一个人可以在Haskell类型系统中实现Lambda演算。如果Scala可以做到这一点,那么在有意义的Haskell的类型系统中,Scala的类型系统计算相同的类型。问题是:一个自然是多么自然?一个比另一个优雅有多优雅?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top