是什么让Haskell的types系统比其他语言的types系统更“强大”呢?

阅读Scalatypes系统与Haskell的缺点? ,我不禁要问:具体来说,Haskell的types系统比其他语言的types系统(C,C ++,Java)更强大。 显然,即使Scala也不能像Haskell的types系统那样执行一些相同的function。 究竟是什么使Haskell的types系统(Hindley-Milnertypes推断)如此强大? 你能给个例子吗?

具体来说,这是什么使得Haskell的types系统

在过去的十年中,它被devise成既灵活又作为财产确认的逻辑,而且function强大。

Haskell的types系统已经发展了多年来鼓励一个相对灵活,富有performance力的静态检查学科,有几个研究小组的研究人员识别types系统技术,使强大的新类编译时validation。 斯卡拉在这方面相对不发达。

也就是说,Haskell / GHC提供了一个强大的逻辑,旨在鼓励types级编程。 在函数式编程的世界里相当独特的东西。

一些论文指出了Haskelltypes系统的工程devise方向:

  • 有趣的function
  • 与类关联的types
  • 有趣的function依赖

Hindley-Milner不是一个types系统,而是一个types推断algorithm。 Haskell的types系统在以前可以完全使用HM来推断,但是该船已经为现代Haskell提供了很长时间的扩展。 (ML仍然能够被完全推断)。

可以说,主要或完全推断所有types的能力在performance力方面产生了力量。

但是,这大部分不是我认为这个问题真正的问题。

与其他方面相关的论文指出,对Haskelltypes系统的扩展使得它完整(并且现代types的家族使得完整的语言更接近于价值级编程)。 关于这个话题的另一个不错的论文是McBride的“ 欺骗它:模拟Haskell中的依赖types” 。

在Scala的另一个线程中的文章:“将类作为对象和隐含types”进入到为什么你实际上也可以在Scala中完成大部分的工作,虽然有一点更明确。 我倾向于感觉,但是这比直接从Scala经验中得到的直觉更具直觉性,它更加特别和明确的方法(C ++讨论中称之为“名义”)最终会变得混乱一些。

让我们来看一个非常简单的例子:Haskell的Maybe

 data Maybe a = Nothing | Just a 

在C ++中:

 template <T> struct Maybe { bool isJust; T value; // IMPORTANT: must ignore when !isJust }; 

让我们考虑一下Haskell中的这两个函数签名:

 sumJusts :: Num a => [Maybe a] -> a 

和C ++:

 template <T> T sumJusts(vector<maybe<T> >); 

区别:

  • 在C ++中,可能会犯更多的错误。 编译器不检查Maybe的使用规则。
  • sumJusts的C ++types没有指定它需要+并从0 sumJusts 。 当事情不起作用时显示的错误信息是神秘而奇怪的。 在Haskell中,编译器只会抱怨这个types不是Num一个实例,非常简单。

总之,Haskell有:

  • 抽象数据types
  • 型类
  • 一个非常友好的语法和良好的支持generics(在C ++的人试图避免,因为他们所有的cryptickynessishisms)

Haskell语言允许您编写更安全的代码而不会放弃function。 现在大多数语言都是为了安全而交换特征的:Haskell语言就是为了表明两者都有可能。

我们可以生活在没有空指针,明确的铸造,宽松的打字,仍然有一个完美的expression语言,能够产生有效的最终代码。

更多的,Haskelltypes系统,以及其默认的懒惰和纯粹的编码方法,可以帮助您提高并行性和并发性等复杂而重要的事务。

只是我的两分钱。

其他语言中我非常喜欢和想念的一件事是对typclasses的支持,它是许多问题(包括多variables函数)的优雅解决scheme。

使用types类,非常容易定义非常抽象的函数,它仍然是完全types安全的 – 就像这个Fibonacci函数一样:

 fibs :: Num a => [a] fibs@(_:xs) = 0:1:zipWith (+) fibs xs 

例如:

 map (`div` 2) fibs -- integral context (fibs !! 10) + 1.234 -- rational context map (:+ 1.0) fibs -- Complex context 

你甚至可以为此定义你自己的数字types。