Scala和Haskelltypes系统有什么区别和相似之处?
如何向Haskell专家解释Scala的types系统? Scala的优势是什么?
如何将Haskell的types系统解释为高级的Scala实践者? 在Haskell中可以做什么不能在Scala中完成?
Scala对于一个Haskell程序员来说:
斯卡拉是一个严格和不纯的语言与一stream的模块。 新types被声明为模块(“类”/“特征”,具有细微差别)。 模块可以是采用普遍量化types参数的types构造器。 模块具有由值,可变variables和函数组成的成员(称为“方法”,模块作为一个variables被隐式地传递给this
)。 模块可能有types成员,也可以带参数。 types成员是存在量化和types参数可以更高的主观。 因为types可以是第一类值的成员,所以Scala提供了一种称为path依赖types的依赖types的风格。
一stream的function也是模块。 函数是一个名为apply
的方法。 一个方法不是一stream的,但提供了一个语法来包装一个方法在一个一stream的function。 不幸的是,一个模块需要所有的types参数,因此部分应用的一类函数不能被普遍量化。 更一般地说,斯卡拉完全缺乏sorting高于1的types的直接机制,但是可以利用高端types的参数化模块来模拟sortingntypes。
Scala允许您声明任何给定types的隐式值,而不是使用具有全局作用域的types。 这包括函数types,它提供了隐式转换,因此也提供了types扩展。 除了隐式转换之外,types扩展由“扩展”机制提供,它允许您在模块之间声明子types/超types关系。 这种机制可以用来模拟代数数据types,其中超types可以被看作是数据声明左侧的types,其子types可以被看作是右侧的值构造函数。 这也意味着ADT并不真正closures。 Scala具有丰富的模式匹配function,使用具有一stream模式的虚拟化模式匹配器。
Scala支持子types,这大大限制了types推断。 但是types推断随着时间的推移而改善。 推荐更高的kindedtypes是支持的。 然而,斯卡拉缺乏任何有意义的types系统,因此没有仁慈的推理和没有统一的东西。 如果引入了一个typesvariables,那么除非另有注释,否则它是相同的。 某些types如Any
(所有types的超types)和Nothing
(每个types的子types)在技术上都是各种types的,尽pipe它们不能用于types参数。
Haskell给Scala程序员:
Haskell是一个纯粹的函数式语言。 这意味着function不允许有任何副作用。 例如,一个Haskell程序不会打印到屏幕上,而是一个返回IO[_]
数据types的值的函数,该值描述了IO子系统要执行的一系列操作。
尽pipeScala默认是严格的,并为非严格函数参数提供了“by-name”注解,但Haskell默认使用“by-need”语义惰性,并提供严格参数的注释。
Haskell中的types推断比Scala中的types推理更完整,即使对于部分应用的多态types构造函数也有完全的推理。 这意味着types注释几乎是不必要的。
最近对GHC编译器的扩展允许在Scala中没有等价的高级types系统特性,例如rank-ntypes,typetypes和polykinds。
在Haskell中,模块是types和函数的集合,但模块不是一stream的实体。 蕴含是由types类提供的,但是这些属性在声明之后是全局作用域的,并且不能像Scala那样显式传递。 给定types的给定types类的多个实例由newtype
机制解决,而在Scala中,这可以简单地通过作用域或显式传递实例来解决。
由于Haskell不是“面向对象的”,所以没有方法/function的二分法。 每个函数都是一stream的,每个函数默认都被curry(没有Function1,Function2等)。
我不相信任何人有系统地将Haskell(如GHC的types系统)与Scala进行比较。 不同之处在于types推断的程度,以及对高级别types的支持。 但是,充分处理差异将是一个可发表的结果。