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

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

有帮助吗?

解决方案

Scala致Haskell程序员:

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

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

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

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

Haskell加入Scala程序员:

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

默认情况下,Scala是严格的,并提供“按名称”;对于非严格函数参数的注释,Haskell在默认情况下是使用“按需”而延迟的。语义,并提供严格参数的注释。

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

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

在Haskell中,模块是类型和函数的集合,但模块不是第一类实体。 Implicits由类型类提供,但这些类是全局范围的dec

其他提示

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

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