现实世界中的Haskell与过程式编程对比

48

最近我对函数式编程产生了浓厚的兴趣。

尽管我对Haskell和它似乎提供的可能性感到非常激动,但我现在也认识到需要一段时间才能掌握它。在一个关于 如何学习Haskell 的SO问题中,有一个答案说除非 "掌握" 它,否则将需要数月甚至数年的时间。

我知道C、PHP、一些面向对象的东西等等。但是既然被告知Haskell在"真实世界"中并不经常使用,那么如果我提高我已经掌握的常规语言的技能,会更好吗?学习Haskell是否值得努力?

在这个关于为什么人们认为函数式编程会流行的问题中,结论似乎是函数式编程将会"流行起来"。但是程序化编程肯定仍然处于主导地位,是吗?

编辑:keparo很好地澄清了我的问题:与过程化语言相比,学习Haskell和函数式编程范例是否有价值?


2
真正的问题是什么?学习函数式编程范式是否值得?学习Haskell以及函数式编程范式是否值得? - Ionuț G. Stan
主要是Haskell但也包括纯函数式编程范式,因为我认为它们似乎有密切的关联。 - user50685
在 Haskell 上运行初创公司:https://www.youtube.com/watch?v=ZR3Jirqk6W8 - Erik Kaplun
13个回答

56

Haskell并不像人们宣传的那么难学。学习Haskell会为你打开一个你从未了解过的新世界。它与任何其他语言一样有价值,学习它对你的收益也是很大的。也许你不会找到需要使用Haskell编程的工作,但这真的意味着一门语言没有价值吗?

Haskell将教给你很多新的东西,并向你展示如何更好地在你目前使用的编程语言中编写程序。你可以利用空闲时间做自己的个人项目。

如果你将“现实世界”定义为“赚钱机器”,那么Haskell并没有在“现实世界”中得到广泛使用。因此,如果这是你的目标,那么你可能需要重新思考目标 :p

另外,我不太喜欢所选择的“如何学习Haskell”的部分。掌握任何语言通常需要几个月至几年的时间,而不仅仅是Haskell。这取决于你如何定义“掌握”。我已经学习Haskell一个月了,即使我慢慢来,但我已经能够相当熟练地使用它。


27
我认为C++基础知识(其中包括STL的高效用法)比Haskell基础知识更难掌握。 - Dario
很多好的答案。非常感谢大家迄今为止的回答。我选择接受这个答案,因为我认为它是对我的具体问题最普遍和非主观的回答。 - user50685
3
需要几年时间,这取决于你要转换到的语言是否属于相同的范式。从面向对象编程(OOP)到OOP的匹配只需要学习语法。从OOP到函数式编程(FOP)需要学习语法、思维方式和范式转变。 - WeNeedAnswers
2
+1 for "isn't as hard as people say". 有时候听起来好像只有至少拥有范畴论学位的人才能理解 Haskell,但这并不是真的。而且,说实话,许多范畴论的概念其实相当简单(但基础)。只是它们有复杂的名称罢了。 - Ingo
1
@WeNeedAnswers:如果你从Java或Python等面向对象编程语言转到使用模板的C ++,那么这不仅仅是学习语法,因为C ++模板中可能会涉及一些严肃的高阶概念,更像是Haskell或Scala中的类型。 - Erik Kaplun

20

学习Haskell,即使没有其他收获,它所提供的转变思维方式也将有助于你回到工作场所中那些仍在使用的过程式语言。

函数编程范式已经开始进入各种主流应用程序和语言——甚至包括C ++将在C ++ 0x中添加一个(受限的)lambda表达式。

您可能还想看一些混合语言,比如Scala或OCaml。Twitter正在使用Scala,并且Jane's Street在金融交易平台上使用OCaml。


2
在C++中,元模板编程是一种纯函数式语言,这正是吸引我一开始转向Haskell的原因。 - Matthieu M.

11

我学习Haskell是因为它是我尝试过的Scala、Clojure、OCaml和Scheme中远远最好的函数式语言,但我并没有真正期望在工作中使用它。

事实证明,它非常适合那些太小而不适合团队完成且用Java完成需要耗费大量时间的奇怪任务。到目前为止,我已经用它来进行特定数据迁移,即将CSV导出文件转换成其他格式,批量转换XML(HXT比XSLT更简洁、更强大),从互联网上抓取数据以及软件项目估算,包括使用概率单子模型建模风险和使用回溯法生成最优甘特图。这些都是真正需要完成的工作,如果用Java完成可能需要多天时间,我甚至无法尝试去完成。

现在,我用它代替Excel处理任何稍微数学一点的东西,因为在文本编辑器中创建Haskell源代码值列表与在Excel中输入它们几乎同样容易。一旦在Haskell中,我就可以做各种魔法,如回溯、概率分布等,而Excel无法做到。如果我需要一个图表,那么我只需将值输出为CSV文件(2行代码),然后加载到Excel中。

唯一的缺点是需要花费数月时间才能熟练掌握,但在我看来值得付出。


2
我也使用了Haskell来开发一个工具:我需要从我们的应用程序日志中提取和分析错误信息,并生成要加载到Excel中的统计数据(输出为CSV)。我花了一两天的时间编写。如果使用Java或C ++,至少需要三到四天的时间。我还没有尝试在大型项目中使用Haskell,但我想有机会尝试一下。 - Giorgio

10

在职业环境中,你可能不应该期望像 C 语言家族一样频繁地使用 Haskell。如果问题是你是否值得学习 Haskell 和函数式编程范式,答案是肯定的。你可以将对编程的更深入理解应用于你的所有工作。


7
与过程式语言不同,学习Haskell和函数式编程范式对我有价值吗?
如果拥有扩展的技能组合是有价值的,那么答案是肯定的。
你可能会获得的一个优势是并行和并发编程。过去的过程式语言往往没有明确的副作用概念,因此在它们中编写并行程序难以正确完成。函数式语言(特别是限制副作用的语言,如Haskell)有更多关于高效并行编程的内容。
拥有这种技能是不会有害的。

6
与过程式语言不同,学习Haskell和函数式编程范式对我有价值吗? 除非你想过得很痛苦。Luke Plant在《为什么学习Haskell/Python会让你成为一个更差的程序员》中说道: “因此,学习Python和Haskell使我失去了信心,并鼓励我编写难以理解的奇怪代码......” (这不完全是一个玩笑。)

5
我可以看出,如果非函数式代码可以很容易地使用函数式编程,那么函数式编程在生产环境中会是一个优势。我猜微软也这么认为,所以他们推出了F#。
由于它们都编译成IL,你可以用函数式方法解决问题,并在过程性代码中轻松使用这些解决方案。
这样,函数式代码可以逐渐地在生产环境中找到自己的位置。
因此,鉴于微软的用户群体如此之大,我猜如果F#未来不远,Haskell也不会。

4

我认为这是值得努力的。 它将帮助您了解问题是如何解决的,而不仅仅是计算机的工作原理。

也许一个特定的问题是Haskell本身——作为纯函数语言,它有点“强硬”,这反过来甚至可能使事情更加复杂。

相反,函数式编程可能在非常实用的情况下非常有用——许多面向对象/命令式语言现在包含功能元素(Linq、匿名函数、只读值、函数指针/委托、类型推断):您可以集中精力于应该完成的任务,从而允许您用更少的代码表达更多内容(这甚至更少容易出错)。

非纯函数语言(标准函数语言)如Scala或F#可以轻松地集成到现有的Java或.NET项目中,因此您可以在需要时结合两种范例的优点。有关函数语言的典型优点,请参见此线程。想想极其强大的解析(Monadic parser combinators / Parsec)或使用函数语言进行并发编程的可能性,你就会看到它们是多么有用。


2
扩展你的视野有助于成为更好的程序员,无论你目前使用的是哪种语言。例如,编写Lisp宏后,你将永远不会再以同样的方式看待编程。当你开始用Haskell思考时,你会发现自己在较低级别的语言中组合函数并希望使用闭包。
从C#的诸如lambda、类型推断、闭包等好处来看,学习Haskell将使你在未来主流语言的前沿拥有优势。

2

有些人喜欢使用Haskell进行编程。如果你可以选择自己的环境,并且享受是一个考虑因素,那么也许你应该尝试一下。

很多程序员没有选择自己的工具的权利,而且享受并不是他们选择的因素。很多人在工作中使用C/Java等语言作为“核心项目源代码”,但同时也需要或选择使用Python来编写“脚本”,例如使用SCons构建脚本、其他生成Java等代码的脚本、测试系统、概念证明等。在其他地方,Python也被用于“核心项目”。

在8年后,Haskell会取代Python成为主流语言。但你可以提前学习它。


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