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

时间:2009-04-22 18:04:16

标签: functional-programming

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

许多首先学习命令式编程风格的程序员发现学习函数式编程非常困难,因为它是如此不同。我开始怀疑那些先学习函数式编程的程序员是否会发现很难开始命令式编程。看起来它不会像其他方式那样难,所以我认为如果更多程序员首先学习函数式编程会是一件好事。

所以,我的问题是,如果在命令式之前在学校教授函数式编程,如果是这样的话,为什么从它开始并不常见呢?

15 个答案:

答案 0 :(得分:28)

实际上,有些学校已经这样做了。在我学习的地方(哥本哈根大学),他们在第一学期教授SML,作为编程的介绍。然后,他们之后教Java,作为OOP的介绍。

我认为它的效果非常好,我同意你的看法,它比其他方式更好。 函数式编程对于尚未成为程序员的人来说相当直观。它更好地映射到我们在高中或更早的时候被教授的数学,所以那些尚未接受命令式编程的人通常会毫不费力地接受它。

事实上,有一种趋势是,那些刚接触编程的人比那些已经学习过Java或C ++的人更快选择SML

从命令到功能似乎有一个很大的概念上的跳跃,但反过来似乎更容易。学习SML后,学生在接触Java时通常不会发现Java困难。一旦你了解了编程的“纯粹”概念,粘贴副作用就相当简单了。但如果您对编程的全部理解都是基于副作用,那么很难想象任何事情都可能没有它们。

我认为这种方法的一大好处是函数式编程原则成为编程工具箱的重要组成部分,而不是你想炫耀时可能会使用的一些深奥的附加组件。即使用命令式语言编程,我认为将您的背景用于函数式语言也是有益的。即使在像C这样的低级编程中,也可以考虑最小化状态和副作用,并习惯于高阶函数的概念(即使它们在语言中不可用)

答案 1 :(得分:12)

许多学校教授函数式编程。他们中的一些人甚至先教它。我认为麻省理工学院长期以来习惯于在计算机编程课程的介绍中教授计划。

在我的学校,我们将ML作为“比较编程语言课程”的一部分,每个人都必须参加。

无论如何,我认为函数式编程对于来自命令式语言的人来说难以学习。至少它不适合我。

很多人认为像Haskell和Scheme这样的语言没有得到更广泛采用的原因是因为人们被命令式编程“毁掉”了。那是胡说八道。

这些语言未被广泛采用的真正原因是因为他们不使用花括号。严重。

C / Algol语法风格很流行,因为人们喜欢它的外观。

越来越多地采用功能性编程的关键不是要讨论Haskell有多么出色以及邪恶的副作用,或者反复说出“monad”这个词。相反,只需创建一个使用花括号和分号的函数式语言。人们会用它。

答案 2 :(得分:9)

许多(大多数?)学校教授功能编程。由于很多原因,很少有人会先教导它。

  • 大多数开发环境 功能语言吮吸,和 需要大量的编程 充分利用的知识。这是 变得越来越不真实,但是 我们还远离视觉 Haskell工作室。

  • 跳进'华而不实'更难 东西'。 GUI工具包和库很糟糕 对于大多数功能语言。在屏幕上显示内容并奖励学生很重要。

  • 自学成才的程序员倾向于 倾向于命令式/ OO语言 由于历史原因。 BASIC在年轻时的可用性,知道他们最喜欢的游戏是用C或C ++编写的,你可以说出来。

  • 简单的资源和教程 函数式编程语言 更难得。在Code Project上将C#样本的数量与Lisp样本进行比较。请记住,Lisp已经超过5倍了。

答案 3 :(得分:5)

这可能是一个思想共享的问题,因为大多数教师/教授也可能首先学习命令式的风格。

另外,我猜想有更多的工作可用于教授不完美的风格。

答案 4 :(得分:2)

我只能假设OOP似乎是最喜欢的流行语/风格,所以学校坚持这一点,

我从一开始就被教授OOP设计,它最近才一直在教自己编程的功能风格,我可以看到它有它的优点。

答案 5 :(得分:2)

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

允许教师购买材料的教科书公司是最大的问题。教科书公司很快就会抓住“下一件大事”,这是几年前的OOP。功能性编程已经被淘汰。许多教师不能或不允许在没有教科书的情况下教授课程,因此课程选择通常遵循大型供应商提供的教科书。

答案 6 :(得分:1)

首先,我发现你的问题的基础是错误的,因为我在学校教过函数式编程。 (这不是我开始的,但我们确实做了一些函数式编程。)

其次,我质疑从功能编码转移到命令式编码的难易程度。我认为这不像你想要的那么容易。

第三,编程(对大多数人来说)是一种工作技能。绝大多数商店都使用命令式编程。因此,对未来的编码人员来说,学习命令式编程是最有用的。

答案 7 :(得分:1)

命令式编程的明确控制流程非常适合在教学环境中实现和分析算法。面向对象编程是一种方便的扩展,因此它最常被使用。另一方面,功能编程(实际上是任何类型的声明性编程)是一个完全独立的范例,需要一整套新的考虑因素(性能和其他方面),如果您首先理解命令式编程,其中许多考虑因素都更容易可视化。毕竟,这最终归结为一种必要的语言。

答案 8 :(得分:1)

学校的课程必须有一个历史角度(显示我的年龄)。当我开始时,功能是我必须学习的。

但是把它放在一边,你必须从某个地方开始,所以其中一个必须先行。如果你从命令开始,那么当你学习功能时,你会遇到的事情就不会存在,你将不得不习惯以不同的方式做事。如果你从功能开始并转向命令式,那么你将不得不习惯于学习新概念/结构并记住它们在那里使用。

无论何时编程,您都在尝试解决问题。最好在工具箱中同时使用以解决手头的问题。这就是为什么我认为最好从imerative开始然后学习功能:如果你发现自己找不到那些表明选择了错误工具来解决问题的东西。

除此之外,这是一个折腾。

答案 9 :(得分:1)

我实际上只是在正在开发Bootstrap(目前由公民学校运营的编程课程)的人发表的演讲中。他似乎认为函数式编程风格为代数提供了更好的背景,因为它将函数的概念作为进程和对象(具有自己的属性)。 (当然,声明性编程语言也可以拥有一流的功能,但重点并不是那么多。)

就个人而言,我认为首先教授函数式编程是值得的。声明式方法很早就在数学类中讲授,因此函数式编程提供了一些声明性编程所没有的新概念。我同意上面的许多海报,认为它“太难”是一个神话,它已经完成了。

答案 10 :(得分:0)

  

所以,我的问题是,如果在命令式之前在学校教授函数式编程,如果是这样的话,为什么从它开始并不常见呢?

虽然我没有幸运能够开始使用功能性语言,但我确实有同事这样做过。我还有一个学习数学的朋友,他在学校学到的唯一语言是Haskell!

实际上有两件事:计算机科学和计算机工程。尽管线条非常薄,IMO,但它在很大程度上取决于课程(如上所述)和相关部门的重点领域,哪种语言可以用来削减牙齿。大多数工程学院都是从C,C ++或Java开始的 - 它们有着巨大的就业市场。其他人,可以从Lisp,Haskell等开始。

答案 11 :(得分:0)

大多数大学都教授功能编程。高中没有教授的部分原因可能是由于“功能编程难以”的神话。

答案 12 :(得分:0)

Dunno在我的本科学习ML中关于你的学校是基础编程语言课程的重要组成部分,还有一门专门针对Haskel的课程。

答案 13 :(得分:0)

老实说,我认为这是一个错误的问题。

如果入门课程的目标是教授基本的计算机科学,算法,以编程方式解决问题,那么您的课程是基础,您可以选择基于清晰度,简单性和提出想法的课程。一些函数式语言对此非常有用。特别是如果学生很少或没有以前的经历。

但这通常不是许多入门课程的目标。他们可能需要某些技术或某些语言用于以后的课程。他们可能想要利用特定的库等。他们可能只需匹配某些“功能”的复选框列表。

所以我想你想把问题放在首位。弄清楚课程实际上要实现的目标,并为此目的选择最佳语言。在某些情况下,这可能是一种功能性语言。

如果你真正问的是如何最好地教授入门级编程和计算机科学,那就是一种不同的蠕虫病毒。

答案 14 :(得分:0)

我想,应该,是的。

此外 - 没有控制台应用程序,也没有“调色板混音器”,但首先是单元测试。

只有学生表现良好并且编写具有极高覆盖率的测试用例时,才允许他们快速查看如何从键盘读取字符。

在我看来,大多数糟糕的编码实践(代码气味,反模式)来自对理论和最佳实践的完全无知。

所以 - 首先教他们F#,禁止使用控制台i / o和GUI,只使用单元测试。

其次,在OOP环境中教授命令性/功能性混合风格,充分利用和解释设计模式。

然后 - 然后他们可以尝试将clickybuttons放在某处,也许作为奖励。但首先是理论和良好的编码实践。否则我们会创建下一代“RAD” - 受害者甚至无法正确使用缩进,并将ctrl + c / ctrl + v误认为是软件开发。