scala - Scala 和 Haskell 类型系统的区别和相似之处是什么?

标签 scala haskell type-systems

如何向 Haskell 专家解释 Scala 的类型系统?
哪些例子展示了 Scala 的优势?

如何向高级 Scala 从业者解释 Haskell 的类型系统?
在 Haskell 中可以完成哪些 Scala 无法完成的工作?

最佳答案

Scala 致 Haskell 程序员:

Scala 是一种严格且不纯的语言,具有一流的模块。数据类型被声明为具有细微差别的“类”或“特征”,模块或“对象”是这些类型的值。 Scala 支持采用通用量化类型参数的类型构造函数。对象/类/特征的成员由值、可变变量和函数(称为“方法”,模块作为名为 this 的变量隐式传递给它)组成。模块可能有类型成员,也可以带参数。类型成员是存在量化的,类型参数可以是更高级的。因为类型可以是一等值的成员,Scala 提供了一种称为 path-dependent types 的依赖类型。 .

一等函数也是模块。函数是具有名为 apply 的方法的模块.方法不是一流的,但提供了一种语法来将方法包装在一流的函数中。不幸的是,一个模块需要预先设置它的所有类型参数,因此部分应用的一流函数不允许被普遍量化。更一般地说,Scala 完全缺乏对高于 1 的等级类型的直接机制,但是可以利用在更高级类型上参数化的模块来模拟等级 n ​​类型。

Scala 允许您声明任何给定类型的隐式值,而不是具有全局作用域的类型类。这包括提供隐式转换和类型扩展的函数类型。除了隐式转换之外,类型扩展由“扩展”机制提供,它允许您声明模块之间的子类型/父类(super class)型关系。这种机制可用于模拟代数数据类型,其中父类(super class)型可以被视为数据声明左侧的类型,其子类型可以被视为右侧的值构造函数。 Scala 使用具有一流模式的虚拟化模式匹配器具有广泛的模式匹配功能。

Scala 支持子类型,这在很大程度上限制了类型推断。但随着时间的推移,类型推断得到了改进。支持更高级类型的推断。然而,Scala 缺乏任何有意义的种类系统,因此没有种类推断和种类统一。如果引入了一个类型变量,它的种类是 *除非另有说明。某些类型,如 Any (所有类型的父类(super class)型)和 Nothing (每种类型的子类型)在技术上属于每种类型,尽管它们不能应用于类型参数。

Haskell 给 Scala 程序员:

Haskell 是一种纯函数式语言。这意味着函数根本不允许有任何副作用。例如,Haskell 程序不会像这样打印到屏幕上,而是一个返回 IO[_] 值的函数。描述 IO 子系统要执行的一系列操作的数据类型。

Scala 在默认情况下是严格的,并为非严格函数参数提供“按名称”注释,而 Haskell 在默认情况下使用“按需要”语义是惰性的,并为严格参数提供注释。

Haskell 中的类型推断比 Scala 中的更完整,具有完整的推断。这意味着几乎不需要类型注释。

GHC 编译器的最新扩展允许高级类型系统功能,这些功能在 Scala 中没有等价物,例如 rank-n 类型、类型系列和种类多态性。

在 Haskell 中,模块是类型和函数的集合,但模块不是一流的实体。隐式是由类型类提供的,但是一旦声明它们就是全局范围的,并且它们不能像在 Scala 中那样显式传递。通过用 newtype 包装来解析给定类型的类型类的多个实例。消除歧义,而在 Scala 中,这可以通过确定范围或显式传递实例来解决。

由于 Haskell 不是“面向对象的”,因此没有方法/函数二分法。每个函数都是一流的,默认情况下每个函数都是柯里化的(没有 Function1、Function2 等)。

Haskell 没有子类型机制,但是类型类可以有子类关系。

关于scala - Scala 和 Haskell 类型系统的区别和相似之处是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1815503/

相关文章:

scala - 使用 Scalatra 和 Casbah 进行 CRUD 操作

haskell - `pure x::IO a` 是纯值还是有副作用的值?

haskell - 递归方法如何工作?

data-structures - 使用 VLists 的哈希表

java - 为什么不能用Java声明Monad接口(interface)?

types - 什么是类型和效果系统?

haskell - 为什么名称形成一种类型而不仅仅是一种类型?

scala - 我们可以在 Scala 中进行条件导入吗?

scala - 为什么 scala 编译器不将其识别为元组?

scala - 无法使用 IntelliJ SBT 控制台导入