Łuk*_*Lew 62 haskell type-systems scala
如何向Haskell专家解释Scala的类型系统?什么样的例子显示了Scala的优势?
如何向高级Scala从业者解释Haskell的类型系统?在Haskell中可以做什么在Scala中无法完成?
Apo*_*isp 96
Scala到Haskell程序员:
Scala是一种严格且不纯的语言,具有一流的模块.数据类型被声明为具有细微差别的"类"或"特征",而模块或"对象"是这些类型的值.Scala支持采用通用量化类型参数的类型构造函数.对象/类/特性具有由值,可变变量和函数组成的成员(称为"方法",模块作为变量调用隐式传递给它this
).模块可以具有也可以采用参数的类型成员.类型成员是存在量化的,类型参数可以更高.因为类型可以是第一类值的成员,所以Scala提供了一种称为路径依赖类型的依赖类型.
一流的功能也是模块.函数是具有名为的方法的模块apply
.方法不是第一类,但提供了一种语法来将方法包装在第一类函数中.不幸的是,模块需要预先考虑所有类型参数,因此不允许对部分应用的第一类函数进行普遍量化.更一般地说,Scala完全没有针对高于1的等级类型的直接机制,但是可以利用在高等级类型上参数化的模块来模拟秩n类型.
Scala允许您声明任何给定类型的隐式值,而不是具有全局范围的类型类.这包括函数类型,它提供隐式转换,因此也提供类型扩展.除了隐式转换之外,"扩展"机制还提供了类型扩展,它允许您在模块之间声明子类型/超类型关系.此机制可用于模拟代数数据类型,其中超类型可以看作数据声明左侧的类型,其子类型作为右侧的值构造函数.Scala具有广泛的模式匹配功能,使用具有一流模式的虚拟化模式匹配器.
Scala支持子类型,这极大地限制了类型推断.但类型推断随着时间的推移而有所改善.支持更高通道类型的推断.但是,Scala缺乏任何有意义的类型系统,因此没有任何类型的推论和任何类型的统一.如果引入了类型变量,*
除非另有注释,否则它是类型的.某些类型的像Any
(所有类型的超类型)和Nothing
(每个类型的子类型)在技术上的每一种,尽管它们不能被应用到类型参数.
Haskell给Scala程序员:
Haskell是一种纯函数式语言.这意味着不允许函数产生任何副作用.例如,Haskell程序不会这样打印到屏幕上,而是一个返回IO[_]
数据类型值的函数,该值描述了IO子系统要执行的一系列操作.
虽然Scala默认是严格的并且为非严格函数参数提供"按名称"注释,但Haskell在默认情况下使用"按需"语义是惰性的,并且为严格参数提供注释.
Haskell中的类型推断比Scala更完整,具有完整的推理.这意味着几乎不需要类型注释.
最近对GHC编译器的扩展允许在Scala中没有等效的高级类型系统功能,例如rank-n类型,类型族和种类多态.
在Haskell中,模块是类型和函数的集合,但模块不是第一类实体.Implicits由类型类提供,但这些类在声明后是全局范围的,并且不能像在Scala中那样显式传递.给定类型的类型类的多个实例通过用newtype
to去歧义来解析,而在Scala中,这可以通过作用域或通过显式传递实例来解决.
由于Haskell不是"面向对象的",因此没有方法/功能二分法.每个函数都是第一类,默认情况下每个函数都是curry(没有Function1,Function2等).
Haskell没有子类型机制,但类型类可以具有子类关系.
我不相信任何人系统地将Haskell(以GHC的类型系统为例)与Scalas进行比较.主要的不同点是类型推断的程度,以及对更高级别类型的支持.但对这些差异的全面处理将是一个可公布的结果.