斯卡拉types系统与Haskell的缺点?
我已经读过,Scala的types系统被Java的互操作性所削弱,因此不能像Haskell的types系统那样执行一些相同的function。 这是真的? 是因为types擦除的弱点,还是我在各方面都是错的? 这是不同的原因斯卡拉没有typeclasses?
最大的区别是Scala没有Hindley-Milner全局types推断,而是使用一种局部types推断的forms,要求你指定types的方法参数和返回types的重载或recursion函数。
这不是由types擦除或JVM的其他要求驱动的。 这里所有可能的困难都可以克服,而且一直在考虑Jaskell – http://docs.codehaus.org/display/JASKELL/Home
HM推理在面向对象的上下文中不起作用。 具体来说,当使用types多态性时(与types类的ad-hoc多态性相反)。 这对于与其他Java库进行强大的互操作非常重要,并且(在较小程度上)可以从JVM中获得最佳的优化。
说Haskell或者Scala有更强的types系统是不正确的,只是它们是不同的。 两种语言都在向不同的方向推进基于types的编程的界限,每种语言都有其独特的优势,难以在另一方面重复。
Scala的types系统与Haskell的types系统不同,尽pipeScala的概念有时直接受Haskell的优势和知识渊博的研究人员和专业人士的启发。
当然,在主要用于function性编程的虚拟机上运行的虚拟机,与针对该平台的现有语言会产生一些兼容性问题。 由于大多数关于types的推理发生在编译时,Java(作为一种语言和一个平台)在运行时的限制是没有什么可担心的(除了types擦除,虽然正是这个错误似乎使整合到Java生态系统更加无缝)。
据我所知,types系统级别上与Java唯一的“妥协”是处理原始types的特殊语法。 虽然Scala甚至不允许使用原始types,但它接受那些具有该错误的旧Java类文件。 也许你已经看到像List[_]
(或更长的等价List[T] forSome { type T }
)的代码。 这是Java的兼容性function,但在内部也被视为存在types,并不会削弱types系统。
Scala的types系统支持types类 ,尽pipe比Haskell更加冗长。 我build议阅读本文,这可能会对Scala的types系统的相对优势产生不同的印象(第17页的表格可以作为非常强大的types系统概念的一个很好的列表)。
与types系统的力量不一定相关的是Scala和Haskell的编译器用来推断types的方法,尽pipe它对人们编写代码的方式有一些影响。 有一个强大的types推断algorithm可以使得写更多的抽象代码是值得的(你可以自己决定,如果这在所有情况下都是好事)。
最后,斯卡拉和哈斯克尔的types系统是由为用户提供解决问题的最佳工具的愿望所驱动的,但是却采取了不同的途径来实现这一目标。
另一个有趣的点要考虑的是,斯卡拉直接支持经典的面向对象的风格。 这意味着,有子types关系(例如List是Seq的子类)。 这使得types推断更加棘手。 除此之外,你可以混合使用Scala中的特性,这意味着一个给定的types可以有多个超types关系(使它更棘手)
Scala没有rank-ntypes ,尽pipe在某些情况下可以解决这个限制 。
我只和Haskell有一点点关系,但是最明显的是我注意到与Haskell不同的Scalatypes系统是types推断。
在Scala中,没有全局types推断,你必须明确地告诉函数参数的types。
例如,在斯卡拉你需要写这个:
def add (x: Int, y: Int) = x + y
代替
add xy = x + y
这可能会导致问题,当您需要通用版本的添加function,与各种types的工作有“+”方法。 有一个解决方法,但它会得到更详细的。
但是在实际使用中,我发现Scala的types系统对于日常使用来说足够强大,而且我几乎从不使用那些通用的解决方法,也许这是因为我来自Java世界。
而显式声明的局限性并不是一件坏事,你需要logging它。
那么他们图灵还原?
见Oleg Kiselyov的页面http://okmij.org/ftp/ …可以在Haskell的types系统中实现lambda演算。 如果Scala能做到这一点,那么在某种意义上,Haskell的types系统和Scala的types系统就会计算出相同的types。 问题是:彼此之间有多么自然? 一个优雅多一个呢?