我一直在使用haskell一段时间了。我理解大多数/一些概念,但我仍然不明白,haskells类型系统究竟是什么让我做的,我不能用另一种静态类型语言做。我只是直觉地知道,与C,C ++或java中的类型系统相比,haskells类型系统在每种可想象的方式都更好,但我无法在逻辑上解释它,主要是因为缺乏对类型系统差异的深入了解haskell和其他静态类型语言之间。
有人可以举例说明,与具有静态类型系统的语言相比,haskells类型系统更有用吗。简洁明了的例子很简单。
答案 0 :(得分:3)
Haskell类型系统具有许多功能,这些功能都存在于其他语言中,但很少在单一,一致的语言中组合使用:
是否有任何一个使Haskell成为更好的语言是开放的讨论 - 例如,虽然我碰巧喜欢类型类很多,但我知道很多Caml程序员非常不喜欢重载并且更喜欢使用模块系统。 / p>
另一方面,Haskell类型系统缺少其他语言优雅支持的一些功能:
同样,这些是否是通用编程语言中的理想特征是开放的讨论。
答案 1 :(得分:0)
除了其他人已经回答的内容之外,还有Haskell的类型系统使语言纯,即区分某种类型的值和产生结果的有效计算那种类型。
答案 2 :(得分:0)
Haskell的类型系统与大多数OO语言的一个主要区别在于,函数具有副作用的能力由数据类型(如IO
等monad表示)。这允许您编写编译器可以验证的纯函数是无副作用的referentially transparent,这通常意味着它们更容易理解并且更不容易出错。可以用其他语言编写无副作用的代码,但是你没有编译器的帮助。 Haskell让您更仔细地考虑程序的哪些部分需要产生副作用(例如I / O或可变变量)以及哪些部分应该是纯粹的。
此外,虽然它不是类型系统本身的一部分,但Haskell中的函数定义是表达式(而不是语句列表)这一事实意味着更多的代码需要进行类型检查。在像C ++和Java这样的语言中,通常可以通过以错误的顺序编写语句来引入逻辑错误,因为编译器无法确定一个语句必须在另一个语句之前。例如,您可能有一行修改对象的状态,另一行根据该状态执行重要操作,并且由您决定以正确的顺序执行这些操作。在Haskell中,这种排序依赖性倾向于通过函数组合来表达 - 例如f (g x)
表示g
必须先运行 - 编译器可以根据参数类型g
检查f
的返回类型,以确保您没有将它们组成错误的方式。