学习Haskell以便学习Scala

46

我已经阅读了一些关于Scala和Haskell的问题,讨论了两种语言的优点或者应该学习哪一种,但是我已经知道我想要学习Scala。我在大学是Java程序员,现在主要使用PHP。

我希望学习Scala,因为它看起来比Java更好用,适合我的个人项目,而且我也想学习一门函数式编程语言,以提高作为程序员的知识水平。

我在想,学习Haskell作为函数式编程的入门是否是一个好主意,因为它是纯函数式的,所以我可以很好地学习它,而不是在Scala中零散地使用函数式编程,却不知道原因。

我也希望在个人项目等方面使用Haskell,因为它看起来很棒,但我并没有看到很多实际应用,似乎更多用于学术研究,因此想要学习它来获得函数式理解,然后转向Scala。

6个回答

87

作为一位从Java转来,而Scala是通往Haskell的入门药物的人,我认为这是个好主意(先学Haskell)!

Haskell在概念上比Scala简单得多,如果你的目标是学习函数式编程,那么如果你从Haskell开始学习,就不会不了解函数式编程。Scala被设计支持一种"遗留模式"的编码,如果你不想改变你的Java(或PHP)习惯,你也不必太在意。我认为这是一项战略决策,也是一个好决策!这样做可以增加垂死的Java菁英对Scala的接受度。

但是,那并不是你!你实际上对学习新东西很感兴趣...为什么不全力以赴呢?在一个纯粹的环境中学习函数式编程,没有杂乱和回到旧习惯的诱惑,将有助于让你的大脑理解这些概念。

然后,尽情地回到Scala,并学习它与Haskell的区别;它在某些方面较弱,在其他方面则更强,但你将有一个更好的基础来欣赏这些区别。


10
+1 内容写得非常好。“Scala 是通往 Haskell 的入门毒品”这句话是正确的,你可以从 Agda 或 Coq 转到 Haskell,然后再从 Haskell 转到 Scala。不过通常情况下,你真的不会想这么做,因为你会错过一些功能。也许可以看看演讲“在 Haskell 上运行创业公司”,链接为:http://bos.github.com/strange-loop-2011/talk/talk.html#(1) 要用幽默来表达:也许(也许!)当你完美掌握 Haskell 的时候,商业项目中就会有对 Haskell 开发者的需求。也许到那个时候每个人都会写“学习 Coq!”(或者 Agda!...或者下一个大东西)。 - mrsteve
7
我同意。学习 Haskell 会以一种 Scala 无法做到的方式帮助你改变常规思维模式。它还会让你摆脱传统的面向对象编程,学习另一种思考类(类型类)的方式。我推荐这本书:http://www.amazon.com/Programming-Haskell-Graham-Hutton/dp/0521692695 - thoredge
1
@mrsteve:公平地说,Scala确实提供了一些Haskell所缺乏的东西;例如子类型+有界量化。当然,这种额外的能力是以可决定类型推断的代价为代价的,许多人认为这不值得放弃。 - Tom Crockett
4
Haskell 是通向一些难以掌握的东西,如 Coq 和范畴论的入门药物 :) - Tom Crockett
6
我想知道在 Haskell 的美丽吸引下,他是否会回到 Scala ... :-) - hvr
显示剩余2条评论

17

我不会这样做。如果你直接学Scala(你的最终目标),你可以节省时间。你总会学习到函数式编程,但由于Scala是“不那么纯”的,你将能够使用一些类似Java的结构开始编写Scala程序,这将使过渡更加简单。

即使你转向Haskell,你的第一个程序的“函数式质量”也会比后来的程序低,因为只有实践才能改善。开始学习Scala时,你的第一个程序的“质量”将像你在Java或PHP中的第一个程序一样“低”,但是通过实践你会逐渐提高。花费时间去做与目标无关的任务,希望它们可能有所帮助,可能会导致你浪费时间。

专注于你的目标。如果你的目标是Scala,就去学吧。

更新:我认为这篇文章可能与问题相关。它提出了生产力(交付软件)与追求“纯知识”之间的矛盾。


我同意。如果你在使用Scala,对于某些事情使用命令式风格并不会有任何问题,而对于其他事情使用函数式风格也是可以的。学习Haskell并不能帮助你决定哪种工具最适合完成工作。它将教你如何完全消除命令式编程,这是一种不同的范式。 - julx
3
如果你的目标是学习Scala,那就学Scala:大多数教材假定你有Java的背景,因此会明确地帮助你过渡,特别是不会从教授Haskell开始! - Luigi Plinge
关于“最初的程序质量较低”的问题,我认为这是指“无法实现真实应用”。OP将立即开始学习新概念。似乎他们主要目标是巩固FP的概念。与纯FP的概念相比,“真实世界”应用在很多方面都不太相关,你只需在GHCi中输入即可获得所需的学习。 - amindfv
@amindfv 我的意思是,最初使用Scala创建的程序会更加命令式而不是函数式,因为Scala允许混合使用。就我个人而言,我认为这并不是坏事,因为它可以让你通过迭代改进代码来通过实践学习,每次重构都更加“函数式”。这对我学习很有帮助。从答案的投票情况来看,人们更喜欢一种不同的学习方法,即先走一些弯路来学习理论,然后再回到最初的目标,在这种情况下,Scala提供的混合使用变得无关紧要 :) - Pere Villega

17

我从Java背景转到了Scala。最初,我只将Scala视作更好的Java。随着时间的推移,我开始在Scala中使用越来越多的函数式概念。最终,我达到了一个点,在这个点上,我感到需要更纯粹的理解函数式编程。于是我离开了并学习了Haskell。

当我回到Scala时,我发现使用函数式风格变得更容易,之前我曾困惑的一些概念也变得更加清晰。

要成为一名优秀的Scala开发人员,您不必学习Haskell,但我认为一旦您达到了一定的Scala水平,深入理解函数式编程概念确实会对您有所帮助。


7
直接从Scala开始学习,没有任何纯函数式编程语言的基础,风险在于你可能会过于频繁地使用过程化解决方案。
我并不建议以Haskell作为函数式编程的入门语言,虽然它并不特别难 - 它的语法非常简洁 - 但它确实非常奇特(即使在函数式编程的奇特世界中也是如此),我认为你应该用一种更容易转移到Scala的语言来尝试,比如Racket或纯Scheme。
要更好地理解我的意思,请看Haskell、Scala和Scheme中的列表推导式。

4

我先学了Haskell,然后学了Scala,从未后悔。如果你先学Haskell,你会更深入地理解函数式编程。你对函数式编程背后的概念和为什么它们很重要的理解将被深深印在脑海中。Scala的很多东西都来自于Haskell(在我看来)。如果你有Haskell的背景,它会更有意义。不要退缩!你的努力将会得到回报。


0

对我来说,我想学习Scala和函数式编程;因此,我正在学习Scala。我的学习材料是Programming Scala。在阅读了有关语法和其他内容的早期章节后,我跳过了涵盖面向对象内容的章节,直接跳到第8章,其中涵盖了函数式编程内容。在那里,我让自己与FP进行了斗争。

我阅读了this的Scala代码,它是以FP方式编写的,并对进行了分析。你想学习Scala用于“个人项目中改进Java”,学习Haskell则是为了介绍FP。因此,首先,你想要在Java项目上提高生产力,然后副作用地掌握FP。要提高生产力,你必须掌握这门语言。有很多东西可以学习和掌握这门语言,唯一的方法是使用这门语言编写代码。当你学习/使用Scala时,即使你想避免FP,也无法完全避免。我一直在阅读Scala博客(还有书),作者在涉及FP概念时总是不遗余力地做出解释。你不必担心通过Scala路线无法掌握FP。是的,在学习Scala时,你可以像this一样从Haskell中获得灵感。或者如Chris Turner所指出的那样,在你已经能够提高Scala生产力之后,你可以更深入地研究FP。

你想去A点,为什么不直接去A点呢?如果你通过B点(Haskell)的路线前往,你将不得不像Pere Villega所提到的那样推迟你的生产力。


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