2014-10-27 51 views
1

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

有人可以给我举例说明,与具有静态类型系统的语言相比,haskells类型系统更有帮助。那些简洁而且可以简洁表达的例子会很好。

+1

Haskell使用Hindley-Milner类型推理系统。它基本上意味着你不需要指定每个表达式的类型。类型系统可以自行推断大部分类型。 – 2014-10-27 10:13:18

+1

此线程有帮助吗? http://programmers.stackexchange.com/questions/167975/what-c​​an-haskells-type-system-do-that-javas-cant-and-vice-versa – DanielM 2014-10-27 10:15:08

+0

2阶多态性不错 – alternative 2014-10-27 13:24:47

回答

2

Haskell的类型系统具有一些,所有其他语言中存在的功能,但单一的,一致的语言中是很少结合:

  • 它是一种声音,静态类型系统,这意味着数如果不需要运行时类型检查(在Caml,SML中也是如此,在Java中几乎是这种情况,但不是在Lisp,Python,C或C++中)。
  • 它执行静态类型重构,这意味着程序员不需要编写类型,除非他愿意,编译器会自行重建它们(这在Caml和SML中也是如此,但在Java或C中也不例外);
  • 它支持imprandicative多态性(类型变量),甚至在更高的类型(不同于Caml和SML,或任何其他生产就绪语言);
  • 它有很好的支持重载(类型类)(不像Caml和SML)。

是否有任何这些使Haskell成为更好的语言是开放的讨论 - 例如,虽然我碰巧喜欢类型类,但我知道很多Caml程序员强烈反感重载并喜欢使用模块系统。

在另一方面,Haskell的类型系统缺乏其它语言支持典雅的几个特点:

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

再一次地,这些是否是通用编程语言中理想的功能都是可以讨论的。

+0

也可能值得一提:更高级的类型和类型变量。例如,在Java中,你不能写'T '。 – 2014-10-27 18:57:38

+0

@LouisWasserman,谢谢,编辑包括更高的种类。 – jch 2014-10-30 00:20:59

0

除了别人已经回答的内容外,Haskell的类型系统还使语言纯粹为,即它区分某种类型的值和产生该类型结果的有效计算。 Haskell的类型系统和大多数面向对象的语言的之间

0

一个主要区别是,一个函数的能力有副作用由数据类型(如IO这样的单子)表示。这允许您编写纯函数,编译器可以验证这些函数是无副作用的,并且通常意味着它们更易于理解并且不易出现错误。用其他语言编写无副作用的代码是可能的,但是你没有编译器的帮助。 Haskell让你更仔细地思考程序的哪些部分需要有副作用(如I/O或可变变量)以及哪些部分应该是纯粹的。另外,虽然它不是类型系统本身的一部分,但Haskell中的函数定义是表达式(而不是语句列表),这意味着更多的代码需要进行类型检查。在像C++和Java这样的语言中,通常可能通过以错误的顺序编写语句来引入逻辑错误,因为编译器无法确定一条语句必须先于另一条语句。例如,您可能有一行修改对象的状态,另一行根据该状态执行重要的事情,并且由您来确保这些事情按正确顺序发生。在Haskell中,这种顺序依赖倾向于通过函数组合来表达 - 例如, f (g x)意味着g必须先运行 - 编译器可以检查返回类型g与参数类型f以确保您没有以错误的方式编写它们。

相关问题