函数式编程是否应该在命令式编程之前教授?

31

在我看来,函数式编程是一件很好的事情。它消除了状态,并使得代码在并行运行时更容易自动化。

许多最初学习命令式编程风格的程序员发现学习函数式编程非常困难,因为它非常不同。我开始想知道,如果程序员最先学习函数式编程,会不会很难开始学习命令式编程。这似乎不会像另一种方式那样难,所以我认为如果更多的程序员最先学习函数式编程,那就是一件好事。

那么,我的问题是,应该在学校首先教授函数式编程而不是命令式编程,如果是这样,为什么开始使用它不更常见?


5
你说的学校是指小学吗?函数式编程在大多数大学以及任何编程语言课程中都有教授。 - kgrad
3
标题有点误导,大多数学校都会教授函数式编程,而你在正文中提出的问题与标题不符。 - Brian R. Bondy
1
这就是为什么我没有提到雅虎或谷歌的原因。在列出清单之前,我实际上进行了思考,而不是随意打字。;) - Prankster
1
所以你有选择地避开了那些会证明你错误的例子?;) 没有理由不能用函数式语言编写SO、Twitter或其他你提到的网站。Web应用程序已经必须在很大程度上避免可变状态。它们必须能够处理数百或数千个并发会话,每个会话基本上都是将会话ID和HTTP请求映射到输出文档的函数。 - jalf
1
顺便问一下,Prolog这样的语言怎么了?为什么我们不先教授它们呢? - Prankster
显示剩余7条评论
15个回答

28

实际上,一些学校已经采取了这种方式。在我的学校 (哥本哈根大学),他们在第一个学期里先教授SML作为编程入门,然后再教授Java作为面向对象编程入门。

我认为这种方式非常有效,而且我同意你的观点,这比反过来学习更好。 对于那些不是程序员的人来说,函数式编程相当直观。它与我们在高中或之前所学的数学更加契合,因此那些尚未接触命令式编程的人通常可以轻松掌握。

事实上,有一个趋势是,那些刚开始学习编程的人比那些已经学习了Java或C ++的人更快地学会了SML。

从命令式到函数式似乎存在一个很大的概念跳跃,但反过来对大多数人来说似乎要容易得多。当学生在学习SML之后接触到Java时,他们通常不会觉得Java很难。一旦你了解了编程“纯粹”的概念,添加副作用就相当简单。但是,如果你对编程的整个理解都基于副作用,那么很难想象没有副作用的编程是可能的。
我认为这种方法的一个重要好处是,函数式编程原则成为你编程工具箱中不可或缺的一部分,而不是某种奇怪的添加物,如果你想炫耀一下可以使用。即使在使用命令式语言编程时,我认为拥有函数式语言的背景也是有益的。即使在像C这样的低级语言中编程时,也有思考最小化状态和副作用以及习惯于高阶函数概念 (即使这些概念在该语言中不可用) 的好处。


2
我作为学生的经验是先学Scheme,然后是C,接着是OCaml(编译器课程),Java中的面向对象编程并不是很好。Scheme非常棒,作为完全的初学者,我们可以做一些有趣的事情,比如推理系统或符号微积分。我一直在教C语言作为初学者语言(我还不能控制这个选择),状态对于许多学生来说确实是一个难点。但最大的问题是概念上的噪音。C还好,但很难,Java更糟。像Scheme或Smalltalk这样的最小语法和语义对于入门课程非常有效。对于高级面向对象编程,我会选择Smalltalk或Eiffel而不是其他任何语言。 - Damien Pollet

13
许多学校教授函数式编程,甚至有些学校将其作为入门课程。我想麻省理工学院长期以来都将 Scheme 作为计算机编程课程的引言部分。
在我的学校里,我们覆盖了 ML 作为“比较编程语言课程”的一部分,这是每个人都必须学习的。
无论如何,我认为对于从命令式语言转过来的人来说,函数式编程并不难学。至少对我来说不是。
很多人认为 Haskell 和 Scheme 等语言没有得到更广泛的采用,是因为人们被命令式编程毁了。那是胡说八道。
这些语言没有被广泛采用的真正原因是它们不使用花括号。说真的。
C/Algol 语法风格普及是因为人们喜欢它的外观。
增加函数式编程的采用率的关键不是讨论 Haskell 有多棒,副作用有多糟糕,或者反复说“单子”这个词。相反,只需创建一个使用花括号和分号的函数式语言。人们会使用它的。

3
当你正确时,你就是正确的。 - Prankster
2
这让我笑了,但我认为你是对的。 - Zifre
9
Python相当受欢迎,不使用花括号和分号。 - Christian
我发现Scheme很难。在使用Java API之后,这让人感到沮丧 - 我想构建软件,而不是用列表实现类!函数式语言最大的问题是它们只能写不能读,如果没有广泛的注释,很难立即开始使用别人的代码。然而,Clojure有一些希望。 - Hamish Grubijan

9
许多(大多数?)学校教授函数式编程。但由于很多原因,很少有学校将其作为首选语言进行教学。
  • 大多数函数式语言的开发环境较差,需要广泛的编程知识才能使用。虽然这种情况正在变得越来越不成立,但我们离Haskell的Visual Studio还有很远的路要走。

  • 对于大多数函数式语言而言,GUI工具包和库都较差。在屏幕上显示内容并奖励学生非常重要,因为这可以吸引他们的注意力。

  • 自学编程者出于历史原因倾向于选择命令式/OO语言。这是因为在他们年少时BASIC语言很流行,在他们青少年时代最喜欢的游戏可能是用C或C++编写的等等。

  • 函数式编程语言的简单资源和教程难以获得。比较一下Code Project上C#示例与Lisp���例的数量即可看出:请记住,Lisp已经存在了5倍以上的时间。


9
我不同意这个观点。如果你刚开始学编程,函数式编程并不比面向对象编程更难掌握。但是,一旦你深入到命令式编程思维中,学习函数式编程就会变得更加困难。 - jalf
7
我强烈反对“奖励学生”的部分。当我在大学时,很少有作业有图形用户界面,那还是五年前我毕业的时候。我真的希望情况没有改变那么多。 - Kibbee
6
数学是不可变的。如果在方程中x=5,那么x就保持这个值。你不能给它赋一个新值。学生们已经习惯了这一点。不管怎样,我的观点并不是FP更容易,而只是对于从零开始的人来说并不比其他编程方式更难。就像我在答案中所说的,我见过很多人开始学习FP,他们并没有遇到困难,与熟悉命令式编程的人不同,他们没有期望变量应该是可变的。 - jalf
2
我认为“华而不实的东西”(就像你所说的)在CS/编程入门课程中并没有什么作用。这更多关乎于概念。 - boutta
1
对于你的第二点:我认为REPL提供了即时反馈和成功体验(虽然没有图形化)。编写一个完整的程序来显示一些“花哨的东西”“在屏幕上”需要更多的时间和精力。 - thSoft
显示剩余4条评论

5

可能存在一种心智份额问题,因为大多数教师/教授可能也是先学习了命令式编程风格。

此外,我猜想有更丰富的可用于教授命令式编程风格的工具。


2

我只能假设这是因为面向对象编程似乎是一个受欢迎的流行词/风格,所以学校坚持使用它。

我从一开始就学习了面向对象设计,最近我自学了函数式编程风格,我可以看到它有其优势。


2

编辑:下面的内容反映了原标题,"为什么函数式编程不在学校教授",学校有老师,没有教授。学校老师不会自己编写教科书。

老师们可以购买教材的教科书公司是最大的问题所在。这些教科书公司往往追捧“下一个大事”,几年前是面向对象编程(OOP)。函数式编程已经被忽视了。许多老师不能或者不允许在没有教科书的情况下教授课程,因此课程选择通常遵循来自大型供应商的教科书的可用性。


我觉得这很难相信。而且非常主观。此外,任何编程语言课程都会涵盖函数式编程语言。 - kgrad
“Coursepacks” 基本上是由教授编写的教科书,这将使最后一点无关紧要。只要教授确实写了它。 - nilamo
1
现在有一本非常优秀的面向学校教师的教材:http://htdp.org - Norman Ramsey
这不是真的。面向对象编程经过学术界多年的推动,强调可重用性和组合性的好处后,成为了“下一个大事物”。企业在听到这个信息30年后才开始接受。但是企业意味着惯性。函数式编程比面向对象编程具有优势,这就是为什么它在学术界如此重要。但是企业需要时间来倾听。 - nomen

1
首先,我认为你的问题基础有误,因为我在学校里学习了函数式编程。(虽然这不是我开始学习的,但我们确实做了一些函数式编程。)
其次,我质疑从函数式编码转换到命令式编码的简易性。我认为这并不像你所描述的那样容易。
第三,对于大多数人来说,编程是一项职业技能。绝大多数公司使用命令式编程。因此,对于未来的程序员来说,学习命令式编程最为实用。

你可能喜欢为TIOBE添加引用。 - Guy Coder

1

命令式编程的清晰控制流非常适合在教学环境中实现和分析算法。面向对象编程是对此的方便扩展,因此自然而然地被最常使用。另一方面,函数式编程(任何类型的声明式编程)是一个完全独立的范式,需要一整套新的考虑因素(包括性能等),其中许多更容易通过先理解命令式编程来进行可视化。毕竟,最终归结为一种命令式语言。


+1 是因为它归结为一种命令式语言 - 汇编是命令式的,C是命令式的,大多数编译器都会输出汇编或C。 - Hamish Grubijan

1

对于学校的课程来说,这必须有一个历史角度(显露了我的年龄)。当我开始学习时,只需要学习函数式编程。

但是抛开这个不谈,你必须从某个地方开始,所以其中之一必须是第一个。如果你从命令式开始,那么在学习函数式时会发现有些东西不在那里,你必须习惯以不同的方式进行操作。如果你从函数式开始,然后转向命令式,你将需要习惯学习新的概念/结构,并记住它们的使用方法。

无论何时进行编程,你都在尝试解决一个问题。拥有两者作为工具箱中的选择,可以更好地解决手头的问题。这就是为什么我认为最好从命令式开始,然后再学习函数式:如果你发现自己需要的东西不在那里,那就意味着选择了错误的工具来解决问题。

除此之外,我认为这是一个难以决定的问题。


1

我刚参加了一个由Bootstrap的开发者(一份目前由公民学校运营的编程课程)主持的演讲。他似乎认为函数式编程风格为代数提供了更好的背景,因为它涉及到函数作为过程和对象的概念(具有自己的属性)。当然,声明式编程语言也可以拥有一级函数,但重点并不在于此。

个人认为先教授函数式编程是值得的。声明式方法在数学课上就很早被教授了,所以函数式编程提供了一些声明式编程所没有的新概念。我同意以上帖子中许多人的观点,即“太难”的说法是个误解,已经被证明是可以做到的。


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