haskells类型系统以什么方式比另一种静态类型语言的类型系统更有帮助

时间:2014-10-27 10:10:34

标签: haskell types

我一直在使用haskell一段时间了。我理解大多数/一些概念,但我仍然不明白,haskells类型系统究竟是什么让我做的,我不能用另一种静态类型语言做。我只是直觉地知道,与C,C ++或java中的类型系统相比,haskells类型系统在每种可想象的方式都更好,但我无法在逻辑上解释它,主要是因为缺乏对类型系统差异的深入了解haskell和其他静态类型语言之间。

有人可以举例说明,与具有静态类型系统的语言相比,haskells类型系统更有用吗。简洁明了的例子很简单。

3 个答案:

答案 0 :(得分:3)

Haskell类型系统具有许多功能,这些功能都存在于其他语言中,但很少在单一,一致的语言中组合使用:

  • 它是一个健全的静态类型系统,这意味着保证在运行时不会发生许多错误而不需要运行时类型检查(在Caml,SML和Java中几乎都是这种情况,但在比方说,Lisp,Python,C或C ++);
  • 它执行静态类型重构,这意味着程序员不需要编写类型,除非他愿意,编译器将自己重构它们(这在Caml和SML中也是如此,但在Java中不是这样)或C);
  • 它支持impredicative多态(类型变量),即使在更高的类型(不像Caml和SML,或我知道的任何其他生产就绪语言);
  • 它对重载(类型类)有很好的支持(与Caml和SML不同)。

是否有任何一个使Haskell成为更好的语言是开放的讨论 - 例如,虽然我碰巧喜欢类型类很多,但我知道很多Caml程序员非常不喜欢重载并且更喜欢使用模块系统。 / p>

另一方面,Haskell类型系统缺少其他语言优雅支持的一些功能:

  • 它不支持运行时调度(与Java,Lisp和Julia不同);
  • 它不支持存在类型和GADT(这些都是GHC扩展);
  • 它不支持依赖类型(与Coq,Agda和Idris不同)。

同样,这些是否是通用编程语言中的理想特征是开放的讨论。

答案 1 :(得分:0)

除了其他人已经回答的内容之外,还有Haskell的类型系统使语言,即区分某种类型的值和产生结果的有效计算那种类型。

答案 2 :(得分:0)

Haskell的类型系统与大多数OO语言的一个主要区别在于,函数具有副作用的能力由数据类型(如IO等monad表示)。这允许您编写编译器可以验证的纯函数是无副作用的referentially transparent,这通常意味着它们更容易理解并且更不容易出错。可以用其他语言编写无副作用的代码,但是你没有编译器的帮助。 Haskell让您更仔细地考虑程序的哪些部分需要产生副作用(例如I / O或可变变量)以及哪些部分应该是纯粹的。

此外,虽然它不是类型系统本身的一部分,但Haskell中的函数定义是表达式(而不是语句列表)这一事实意味着更多的代码需要进行类型检查。在像C ++和Java这样的语言中,通常可以通过以错误的顺序编写语句来引入逻辑错误,因为编译器无法确定一个语句必须在另一个语句之前。例如,您可能有一行修改对象的状态,另一行根据该状态执行重要操作,并且由您决定以正确的顺序执行这些操作。在Haskell中,这种排序依赖性倾向于通过函数组合来表达 - 例如f (g x)表示g必须先运行 - 编译器可以根据参数类型g检查f的返回类型,以确保您没有将它们组成错误的方式。