Haskell适合作为第一门编程语言吗?

47

我的编程经验主要是命令式语言(C,一些Java),但我会说我没有编程经验。因此:把我当作一个非程序员,Haskell是否适合作为第一门语言?

我的纯数学和计算机科学兴趣似乎与大多数Haskell教程的意图相吻合,尽管我本能地认识到命令式编程的当前和未来行业价值,但我发现函数式编程(在其作为范例的巨大转变)的潜力很迷人。

我想我的问题可以简化如下 - 非程序员必须了解命令式编程才能欣赏和充分利用函数式编程吗?

一些参考资料:


4
你学习编程的目的是什么?只是出于兴趣,还是有特定的事情想要做? - Grant Crofton
我认为好奇心是其中很大的一部分,以及未来预防——我希望理解一种技术,它似乎在未来几天中将在我们编程方式中起到重要作用(警告:这是个人意见)。然而,仅仅为了回答你的问题,我对业余密码学很感兴趣,因此我学习的任何语言都必须能够与数学概念相适应,以便我可以将其与之集成。 - Alex
3
顺便说一下,格兰特的问题很重要,因为这些事情的答案取决于你是想成为一个优秀的程序员,还是只是想学习足够的编程知识来做别的事情。如果你属于后一种情况,答案通常是学习你需要用到的内容,直到你有其他需求之前就不必担心其他方面的东西。如果属于第一种情况,你将需要学习多种语言才能变得真正优秀,因此第一个学的语言并不那么重要,可以根据教学理由进行选择。 - David Thornley
11个回答

34

嗯,SICP 的存在表明函数式语言可以用作入门材料。Scheme 可能比 Haskell 更易于接近。

Haskell 似乎有一个学习难度很高的声誉,但人们往往忘记了经典的命令式编程也很难学。许多人一开始就对“将值分配给变量”的概念感到困惑,而且令人惊讶的是,很多程序员实际上从未真正熟悉指针和间接引用。

Haskell 和抽象数学之间的联系并不像人们有时所认为的那样重要,但对于对数学感兴趣的人来说,查看类比可能提供一个有趣的奖励。


3
我认为SICP之所以很棒并不是因为它使用了函数式语言,而是因为它成功地使用了同一种非常简单的语言来涵盖多个范式。 - Tikhon Jelvis
3
我同意。从某种程度上说,这更多地反映了Scheme而不是SICP。更不用说Scheme几乎只是一点语法围绕着无类型λ演算。甚至可以说λ是终极多范式 - C. A. McCann
1
递归比循环稍微难学一些,但是递归在搜索、树遍历和分治算法中是必需的,所以学习它是一个好主意。Clojure的loop...recur宏可能是我认为最好的选择,介于递归和循环之间。 - aoeu256

30

至少有一项关于教授Haskell给初学者的影响的研究:

以下是摘要:

我们认为,在大一课程中教授纯函数式编程对课程以及促进这种范式都是有害的。相反,我们需要专注于教授编程的基本技术和计算机的基本概念。通过几个学期(多达600名学生)教授Haskell的经验支持了这种观点。这些班级由计算机科学专业的学生和其他学科的学生组成。我们通过在每个学期后进行调查来系统地收集学生反馈。本文提出了在大一课程中使用现代函数式语言的方法,并基于此,主张在这种环境中使用函数式语言。

因此,您可以使用Haskell,但应专注于基本、通用的技术和基本概念,而不是纯函数式编程。

对于初学者程序员,有许多受欢迎的书籍,也使它成为教授这些基本概念的有吸引力的目标,包括:

  • "Haskell编程"
  • "函数式编程的技艺"

此外,Haskell已经被广泛地作为第一门语言教授-- 但请记住,重点是专注于在Haskell中说明的核心概念,而不是教授Haskell这个庞大且丰富的语言本身。


谢谢,这是一个非常好的回答。然而,我应该指出编程和计算机架构的基本概念对我来说并不陌生——我只是想知道在尝试理解它们的功能性之前是否必须先打好这些基础。我刚刚得到了以下内容,并从第一印象中强烈推荐它!http://www.amazon.co.uk/exec/obidos/ASIN/0954300696/textsincomput-21 - Alex

20

我会反对普遍的观点,认为Haskell并不是适合典型的初学者作为第一门编程语言的好选择。我认为对于一个刚开始的新手来说,它并不像Ruby这样的命令式语言那样容易理解。

原因是大多数人没有用函数式的方式思考世界。当他们看到一辆汽车在路上行驶时,他们看到的是同一辆汽车,具有不断变化的可变状态。他们没有看到一系列略微不同的不可变汽车。

如果你查看其他SO问题,你会发现Haskell几乎从来没有被提及为初学者的好选择。

然而,如果你是数学家,或者已经知道足够的编程知识,能够理解函数式编程的价值,我认为Haskell是一个很好的选择。

所以总结一下,我认为Haskell非常适合你,但对于典型的初学者来说并不适合。

编辑:感谢有见地的评论。Owen指出人们以多范式的方式思考是非常真实的。这加强了我认为像Ruby这样的多范式语言会更容易掌握的信念,并且有额外的好处,能够让学生接触命令式和函数式思维。Haskell显然不是多范式的。

Chuck提到了Haskell先进的类型系统,这也是一个很好的观点。虽然我个人更喜欢静态类型的语言,但使用动态语言可以让初学者在好奇心驱使下忽略掉那一部分知识直到他们想要了解背后正在发生什么。Haskell的类型系统,虽然优雅,但从第一天开始就非常显眼。


21
我同意你的结论,但不赞同你的推理。人们并不自然地以适合电脑指令的方式思考世界。因为大多数人首先学习的是命令式编程,所以他们在世界的模型和程序之间建立了一个映射。这与希腊人认为希腊语是事物的“真实”名称,而其他语言则不够直观并没有多少不同。然而,Haskell 作为第一门编程语言是值得怀疑的,因为它非常大,需要用来真正掌握,并且它非常基于类型理论。 - Chuck
6
希腊人也认为大脑是用来防止脊髓掉落的结,以及他们的眼睛能发射出强光激光束,还有前四个数字是神圣真理。但仅因为希腊人在一个无关紧要的论点上错误,并不意味着所有范式都可以像人类思维模式一样轻松映射,也不意味着他对于汽车和可变状态的观点应该被抛弃。 - Evan Carroll
3
人们自然地思考世界的方式与结构化命令式编程非常不匹配。它甚至更不适合纯函数式编程。以有利于编程的方式思考始终是一种非常“不自然”的活动。 - C. A. McCann
6
如果我谈论现实世界中的名词,我会讲到物体、状态、可变属性和不变性。如果我谈论动词,尤其是需要连接起来完成某个任务的一系列动作,我会用一种相当函数式的方式表达,因为把它分解成循环和迭代器会很麻烦。当我写下一个配方时,它会采用命令式语态。陪审团的女士们先生们,请允许我提出一个观点:人们以多范式的方式思考,这一点众所周知。话虽如此,将这些模式转化为程序仍然几乎始终是一个挑战。 - Owen S.
12
在迈阿密的街道上走着的人看到一辆汽车,不会想到犹他州的某个人可以挥动魔法棒,嘭!这辆汽车变成了飞机。这就是无限制变异所带来的结果。函数式编程并不是要在合理的情况下放弃变异,但它确实强调局部推理。高中代数学过的人也不会认为“x = 1”,“x = 2”这样的方程组有意义,当然,“x = x + 1”这个方程也很难理解。因此,我认为人们确实会以等式的方式思考。 - sclv
显示剩余6条评论

13

11个数学家使用Haskell的理由
总结如下:

  • Haskell是声明式语言,数学是最终的声明式语言,这意味着用Haskell编写的代码与您编写的数学语句非常相似。
  • Haskell是高级语言,无需了解缓存、内存管理和其他硬件信息。这也意味着程序短小,这总是很好的。
  • Haskell非常适合符号计算、代数、逻辑等方面。
  • Haskell非常美观 :)

回答您的问题:作为一名没有编程经验的数学家,使用函数式语言开始并不会有问题。实际上,它是更好的选择,因为您不必纠正从C/Java/任何其他语言中获得的大脑损伤。
您还应该检查Mathematica。由于它是商业闭源产品,有些人倾向于不喜欢它,但我认为它是进行数学计算的非常好的环境。


然后你遇到了惰性/非严格性,你的大脑又开始疼了。这并不是一个本质上邪恶的概念(相反),只是你不断需要考虑的事情(就像内存管理一样)。 - mucaho
大多数情况下,您可以忽略“懒惰计算”(不要教人们那个zipWith (+) fib玩意儿)。它只会改变代码的运行速度/内存消耗。 - aoeu256

12

如果你完全没有任何经验的话,实际上在函数式编程中,特别是纯函数式编程中,你会更容易提高生产力。我曾从命令式编程转向函数式编程,发现自己必须忘掉我所学的80%才能在Haskell中提高生产力。

相比之下,后来从函数式编程转向命令式编程则更容易一些。


我也在学习 Haskell!但是,这显然是一种陈词滥调 必须忘记我学到的80%才能在 Haskell 中高效工作。 如果在一种语言中高效工作需要你忘记已经学过的东西而去学习更多的东西——那么你就错了。 - Evan Carroll
1
@Evan 这就是它的本质。函数式编程与命令式编程根本不同。我在遗忘方面并非真正意义上的忘记,而是知道函数式编程中某些东西不存在,比如Haskell中的return与C中的return或者变量赋值(因为Haskell中没有变量)。如果我真的把这些都忘了,那我当然会做错 :) - LukeN
3
我认为学习用不同的方式解决问题很难。从野生代码到过程化编程需要几十年的时间。从过程化编程到面向对象编程还没有完全完成。函数式编程是另一种解决问题的方式,需要不同的思考方式。这就是困难之处,你必须忘记你所知道的80%的东西。 - Hugo Estrada
而 Java/C++ 面向对象编程并不是真正的面向对象编程 : (. 现在 Prolog 和 Idris 呢,那才是令人费解的东西! - aoeu256

4
一方面,我认为Haskell作为第一门语言很不错,但是我认为对于任何真正对编程感兴趣的人来说,应该在学习C之前或与C同时学习(或汇编)。学习C是必要的,可以了解底层发生了什么,做这个和那个的成本是什么,并最终欣赏较高抽象级别和自动资源管理的实用性。我认为当接触C(作为低级命令式语言)和Haskell(作为高级函数式语言)时,大多数学生会发现Haskell既实用又富有表现力。
另一方面,我认为编程是一门手艺。这是一种实践活动,重要的是要学会创造新的、有用的或有趣的东西。所以你需要完成任务。最简单的方法是使用具有你问题解决工具的语言,例如针对你的数据格式的库,针对你的问题类型的算法等。在这一点上,Python(或Ruby)可能是一个更好的选择,因为Hackage在许多领域落后于PyPI(例如,你需要多少天教新手如何在Haskell中操作图像或绘制图表?)。
因此,我的观点是,对低级命令式编程有一定的接触是必要的(可能是面向对象编程)。然后你就可以理解Haskell的价值。但是为了完成任务,并快速提高生产力,Python对于初学者来说是一个更好的选择。Haskell需要几周时间才能成为你的工具。

我们的CPU模型自20世纪80年代以来已经通过流水线和乱序执行得到了改进,当时的C语言非常类似于CPU。Haskell的乱序where子句在某些方面实际上比C更接近。此外,我们的CPU运行方式之所以是为了向后兼容性,因为我们的操作系统是用C编写的。我认为未来是在GPU上使用纯函数式代码进行大规模并行执行。 - aoeu256

3

我认为它适合作为第一门语言,而且学习其他命令式语言可能会干扰学习过程(因为需要先进行大量的反学习)。

但需要注意的是,对于数学背景的人来说,理解函数式编程原则可能更容易,因为这些概念是抽象的数学概念。

我知道许多学校将其作为第一门函数式语言教授,但不是作为第一门语言。


我打算将函数式编程的学习与纯数学的学习结合起来。你能举出一些作为第一种函数式语言使用的例子吗? - Alex
1
@Alex - 除了 Haskell,Scheme 在 MIT 中也被使用过(现在还在用吗?)。 - Oded
谢谢,我知道Scheme ML,并考虑将其作为另一个选择,在花些时间与Haskell相处之后,我可能会尝试一下。 - Alex

3
是的,这本书非常适合想要学习IT技术的人。《Real World Haskell》是一个很好的入门选择。您可以在http://book.realworldhaskell.org/上找到它。

谢谢,我看过RWH了,但是我必须承认,我对编程的理解可能需要比那本书更基础的方法。 - Alex
5
RWH很棒,但更适合来自其他编程语言的程序员。LYAH可能是更好的入门选择。 - C. A. McCann
1
我不喜欢《真正的 Haskell》这本书,现在我正在尝试用 Thompson 的书重新学习 Haskell,并且取得了更多的成功。 - Evan Carroll
我迷上了http://www.haskell.org/soe/ - 这是一本令人费解但有趣的书!- 但几年后我很高兴手头有RWH来填补许多空白。 - Owen S.

1
我会犹豫地说“是”的,但是在学习编程时,如果你选择一种更加命令式的语言作为起点,找到一个导师或者教练会变得更加容易。我可以建议你选择R或Python(配合NumPy和SciPy)。

我更喜欢自学,因为这样既能节省时间又有助于理解。虽然我认为有导师的指导也是很有价值的,但我觉得社区可以/应该提供这种支持(无论使用何种语言)。 - Alex
1
谁需要导师,当你有 Stack Overflow 的时候? - C. A. McCann

1

不。

一个Haskell98程序非常容易被理解。LYAH是一个很好的教程,适合没有经验但想要避免学习扩展x、y、z的初学者。但是防止学习者在扩展x、y、z上绊倒是很棘手的。很快他们开始探索,并且被高级编程/数学概念所淹没,这些概念更难理解,但需要理解才能阅读别人的代码。

如果每个Haskell代码都只用Haskell'98/'10编写,我可能会说是的。


只是为了挑战一下,不想把这变成一个讨论板...Haskell对于教授这些概念的有效性如何? - Alex
我认为这将是非常棒的。 - Tim Matthews
当有人说“Haskell”时,我会读作“Haskell98”,就像有人说“C”时,我会读作“C89”。 - singpolyma

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