Scala和Haskell类型系统有什么区别和相似之处?

时间:2009-11-29 13:10:30

标签: scala haskell type-systems

如何向Haskell专家解释Scala的类型系统? 什么样的例子显示了Scala的优势?

如何向高级Scala从业者解释Haskell的类型系统? 在Haskell中可以做什么在Scala中无法完成?

2 个答案:

答案 0 :(得分:96)

Scala致Haskell程序员:

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

一流的功能也是模块。函数是具有名为apply的方法的模块。方法不是第一类,但提供了一种语法来将方法包装在第一类函数中。不幸的是,模块需要预先考虑所有类型参数,因此不允许对部分应用的第一类函数进行普遍量化。更一般地说,Scala完全没有针对高于1的等级类型的直接机制,但是可以利用在高等级类型上参数化的模块来模拟rank-n类型。

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

Scala支持子类型,这极大地限制了类型推断。但类型推断随着时间的推移而有所改善。支持更高通道类型的推断。但是,Scala缺乏任何有意义的类型系统,因此没有任何类型的推论和任何类型的统一。如果引入了类型变量,除非另有注释,否则它是*种类。某些类型如Any(所有类型的超类型)和Nothing(每种类型的子类型)在技术上都是各种,尽管它们不能应用于类型参数。< / p>

Haskell加入Scala程序员:

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

虽然Scala默认是严格的并且为非严格函数参数提供“按名称”注释,但Haskell默认使用“by-need”语义来保持惰性,并为严格参数提供注释。

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

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

在Haskell中,模块是类型和函数的集合,但模块不是第一类实体。 Implicits由类型类提供,但这些类在声明后是全局范围的,并且不能像在Scala中那样显式传递。通过用newtype换行来消除给定类型的类型类的多个实例,而在Scala中,这可以通过作用域或明确地传递实例来解决。

由于Haskell不是“面向对象的”,因此没有方法/功能二分法。每个函数都是第一类,默认情况下每个函数都是curry(没有Function1,Function2等)。

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

答案 1 :(得分:6)

我不相信任何人系统地将Haskell(以GHC的类型系统为例)与Scalas进行比较。主要的不同点是类型推断的程度,以及对更高级别类型的支持。但对差异的全面处理将是一个可公布的结果。