Haskell的优缺点是什么?

22

我学过几种语言,但现在我想选择一种。我最喜欢的语言是Haskell,它像解释性语言,但却是编译型语言。

Haskell有什么优缺点?


3
http://xkcd.com/1312/ - Surya
6个回答

57

这只是我目前脑海中的一些想法。

优点

  • 学习Haskell会改变你对编程的思考方式(人们学会Haskell后,通常会在其他语言中编写类似 Haskell 的代码)。

  • 类型安全性高于主流语言(空指针异常,有吗?)

  • 类型推断意味着你不必担心类型问题,除非绝对必要。

  • 它生成高性能可执行文件。

  • 使用parpseq组合器可以轻松实现并行化。

  • 交互式环境(hugs/ghci)允许你快速原型设计。

  • 有一个友好的支持社区(IRC、邮件列表等)。

  • 语法非常表达力强和简洁。

  • GHC 正在积极地开发和改进,包括支持在GPU上执行代码,以获得更高性能的计算。

  • QuickCheck > 单元测试

缺点

  • 学习 Haskell 会毁掉你对其他语言的看法。

  • 它非常复杂,不容易入门。

  • 很容易编写一些令人费解的程序,甚至几天后自己也无法理解。


3
能力列表的首位难道不是一个元素吗?也许你的意思是前几个元素。=P - codebliss
2
模块化怎么样?创建复杂应用程序时最大的问题是什么?难道很难正确地获得类型,或者需要频繁重构吗?编写单子和非单子版本是否令人困扰? - egaga
2
学习Haskell会毁掉你对其他编程语言的兴趣。这是真的。在我学习Haskell之前,每次开始一个新项目时,我都会想“好的,用什么语言呢?”现在,除了可能的Agda或Idris,我甚至不考虑其他任何语言。公平地说,Haskell确实比其他语言更适合很多任务。但使用Haskell的主要问题是,有些特定任务需要使用其他语言(例如Node.JS等),而这些语言的库和框架不能轻易地被使用。 - Turion
不知道为什么,Clojure 让我对 Haskell 失去了兴趣。使用反射和宏要容易得多。 - aoeu256

22

使用Haskell开发某些项目可能会有一些不利因素,但学习Haskell是没有任何不利因素的。虽然需要花费时间,但是它是值得的。你将成为更好的程序员。


14

除了它的美感之外,我还想强调Haskell的一些实用功能:

  • 恰好在需要的地方阻止你,否则不会干扰你。这是其中一个有趣的特点,也是为什么Haskell可以正常工作的原因之一。(点击此处了解更多)
  • 具有出色的并发系统,并适用于高性能应用程序。
  • 提供了新的、创新的抽象和设计模式基础,其中包括我个人最喜欢的“函数式反应式编程”。
  • 即使是非常复杂的问题,也易于处理,因为很多在其他语言中需要考虑的事情(正确的顺序、锁定、初始化等)在Haskell中都不太成问题。
  • 惰性求值不只是一种优化。它还允许你以全新的方式解决问题,这对大脑的负担更小。没有破坏性更新,却能够达到与其他语言相同的结果和性能。

如果可以选择,我完全推荐学习Haskell而不是任何其他语言。在现有的语言中,它似乎在安全性、抽象程度和实用性之间做出了最优的权衡。


9
优点:
1) Haskell是最先进的编程语言。我做了一些研究,发现Haskell似乎是唯一真正的先进编程语言。还有其他像Agda和Coq这样的语言,但那些都是相当实验性的并且缺乏真正的世界编程功能(如库支持)。投资于最先进的编程语言是最好的选择。
注:我不会争论为什么Haskell是先进的,而其他编程语言不是。这需要太多时间。所以这只是我的主观意见。其他陈述也是如此。
注:我稍后提到的一些特性可能是GHC特定的,但我仍然只写Haskell。
2) Haskell程序员通常非常聪明。库的代码质量异常高。此外,stackoverflow上的技巧写得非常好,并且在高水平上(感谢像Don Stewart这样的人)。我认为从其他人的代码中学习是提高编程能力的最佳方法。在这方面,Haskell非常出色。
3) 大多数OOP语言中的命令式编程已经过时。具有副作用的通常编程方式也是如此。但是,很少有编程语言可以进行无副作用的声明式编程。例如,Scala、F#、Ocaml和Erlang都不是无副作用的。(然而,在OOP语言方面,也有一些明显不过时的工作,例如Alan Kay过去的工作或者目前Smalltalk领域的最新学术工作。)
4) Haskell支持使用抽象数学概念进行编程(例如monads、functors、combinators、GADT等)。我认为这提高了编程效率。
5) Haskell类型系统非常灵活,并支持类型推断。这大大减少了可能发生的错误。类型系统在编译时进行检查。类型系统可以作为文档帮助编程。
6) 一些先进的概念首先在Haskell中实现(如QuickCheck库)。有很多有趣的扩展。
7) Haskell语法设计非常好。没有不必要的括号。代码紧凑,模式匹配和列表理解的语法相当不错。像Knuth这样的人主张文学化编程,而Haskell/GHC支持它。
8) Haskell支持惰性求值。
缺点:
1) 学习难度很大,需要花费数小时、数月才能掌握Haskell。如果没有适当的计算机科学背景,会更加困难。像Monads和Functors这样的东西很难理解,尤其是没有数学背景的情况下。因此,大多数程序员可能没有能力或意愿学习Haskell。Haskell并不“简单”。但是,不可能有一种支持所有高级功能的简单语言。
2) IDE选项不如其他编程语言好。我使用leksah作为我的IDE,它非常好,但与Java开发的Eclipse相比无法媲美。

3) Haskell无法用于Android或iPhone开发,而Scala可以用于Android开发,并且与Java兼容,这是一个巨大的优势。

4) 我认为一些库缺乏支持维护和改进的人员。我在Haskell中进行语义Web编程,但库的支持还需加强。

Haskell不适合所有项目。如果您需要每毫秒的性能,C/C++可能仍然是最佳选择。因此,Haskell适用于许多项目,但并非所有项目。

Haskell在技术上比其他编程语言具有许多优势。但是,出于政治原因可能会反对使用Haskell。例如,Scala更好地集成了现有的Java基础设施。


8
“Haskell程序员通常非常聪明” -> 这个“理由”似乎出现在大多数关于编程范式的讨论中,尤其是提到Haskell时。我喜欢Haskell,但这纯粹是愚蠢。偏见并不好;在计算机科学中没有有效的教条。将像那样的谬误视为有效的论点只是可悲的。 - user883128
1
最好写“非常优秀的程序员”而不是“聪明的”。像Haskell和更多的Coq/Agda(还有Istabelle等其他语言)吸引了非常优秀的程序员,通常会排除那些不太好的程序员。后者对IO或范畴论的理解不足感到过度沮丧,因此停止使用Haskell。还有许多针对业余程序员的语言(如PHP),或者像Java这样的语言,旨在感觉“简单和熟悉”。 “平均” Agda 用户已经完成了计算机科学或数学的博士学位,并且是非常优秀的程序员。 - mrsteve
嗯,那会更准确一些。还有一些其他的原因是或多或少有争议的,但我同意你的观点。例如,这两种范式都很古老,在现实中有很多事情都与变异有关。尽管如此,你的理由仍然是有效的。 - user883128
即使作为社区维基,这篇文章读起来也像是一则广告。 - GDI512
如果您使用Scala与FP库(如Cats-Effect),则可以获得所有这些组合器和无副作用的代码,尽管我同意它在语法上更冗长。 - arviman

2

但现在我想选择一种语言

...

然后我想知道这种强大语言的优缺点(只是为了做出正确的选择)。

如果您允许我概括,选择一种语言确实取决于您要解决的问题。没有一种选择适用于所有情况,而且总会有某种语言比您现在使用的更好。

不过请继续学习新的语言,因为这样的经历会提高您判断哪种语言适合项目的能力。


2
你想写什么,需要开发哪种类型的应用程序?你想解决哪些问题?
Haskell在某些问题类型上表现出色,但如果你编写的程序需要不断改变状态,则Haskell并不是一个好的选择。
如果模型设计与函数式编程不相符,例如编写CAD(计算机辅助设计)程序,那么面向对象编程将是更好的选择,因为编程范式更适合该模型。
但是,如果你没有受到这些问题的影响,那么Haskell可以成为一种很棒的语言。

1
AutoCAD不是用函数式语言编写的吗? - Chuck
@Chuck - 看起来是用C语言编写的。http://www.fourmilab.ch/autofile/www/subsection2_38_3_1.html - James Black
哦,奇怪。由于某种原因,我以为它是Lisp。感谢您的纠正。 - Chuck
Lisp被用作AutoCAD的脚本语言。 - Nemanja Trifunovic
@Nemanja - 谢谢,我没有考虑过AutoCAD的脚本语言,但这是有道理的,因为它与LISP的灵活性很好地配合。 - James Black
虽然 CAD 比大多数东西都更适合面向对象编程。 - Theo Belaire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接