代码之家  ›  专栏  ›  技术社区  ›  Zifre

在命令式编程之前,是否应该教授函数式编程?[关闭]

  •  30
  • Zifre  · 技术社区  · 15 年前

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

    许多最初学习命令式编程风格的程序员发现很难学习函数式编程,因为它是如此不同。我开始怀疑那些先学函数式编程的程序员是否会发现很难开始命令式编程。这似乎不像其他方法那么难,所以我认为如果更多的程序员首先学习函数式编程,这将是一件好事。

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

    15 回复  |  直到 11 年前
        1
  •  27
  •   jalf    15 年前

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

    我觉得它非常好用,我同意你的观点,它比其他方法更好。 对于还不是程序员的人来说,函数式编程是相当直观的。它能更好地映射出我们在高中或更早的时候学过的数学知识,所以那些还没有接触到命令式编程的人通常会很容易地学会它。

    事实上,有一种趋势是,刚开始编程的人在注册时会选择SML 更快 比那些已经学习了Java或C++的人。

    从命令式到功能式似乎有一个很大的概念跃迁,但对大多数人来说,相反的情况似乎要容易得多。学生在学习SML后,一般不会发现Java很困难。一旦你了解了编程的“纯”概念,那么粘合副作用就相当简单了。但是,如果您对编程的全部理解都是基于副作用的,那么很难想象任何事情都有可能发生。 没有 他们。

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

        2
  •  12
  •   Scott Wisniewski    15 年前

    许多学校教授实用程序设计。他们中的一些人甚至先教。我认为麻省理工在很长一段时间里,在计算机编程课程的导论中,一直在教授这个计划。

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

    无论如何,我认为对于来自命令式语言的人来说,函数式编程并不是那么难学。至少不是为了我。

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

    这些语言没有被广泛采用的真正原因是它们不使用大括号。说真的。

    C/ALGOL语法样式很流行,因为人们喜欢它的外观。

    增加功能程序采用的关键是不要谈论haskell有多大,副作用有多严重,或者反复说“monad”这个词。相反,只需创建一种使用大括号和分号的函数语言。人们会使用它。

        3
  •  9
  •   Andrew Grimm atk    13 年前

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

    • 大多数开发环境 功能语言很糟糕,而且 需要广泛的编程 充分使用的知识。这是 变得越来越不真实,但是 我们离视觉还很远 哈斯克尔工作室。

    • 在“浮华”中跳起来更难 东西。图形用户界面工具包和libs-suck 对于大多数功能语言。在屏幕上展示东西和奖励学生很重要。

    • 自学的程序员倾向于 倾向于命令式/oo语言 因为历史原因。知道他们最喜欢的游戏是用C或C++写的,你可以说出它的基本知识。

    • 简单的资源和教程 函数式编程语言是 很难来。比较代码项目中C样本和Lisp样本的数量。记住Lisp的年龄是原来的5倍多。

        4
  •  5
  •   chills42    15 年前

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

    另外,我想还有更大范围的工作可以用来教授违纪风格。

        5
  •  2
  •   Fusspawn    15 年前

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

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

        6
  •  2
  •   eleven81    15 年前

    编辑: 以下内容反映了原始标题, 为什么学校不教函数式编程? “学校有教师,而不是教授。学校老师不会自己写课本。

    允许教师购买教材的教科书公司是最大的问题。教科书公司很快就跳上了几年前的“下一件大事”。函数式编程已经走到了尽头。许多教师不能或不允许在没有教科书的情况下教授课程,因此课程选择通常遵循大供应商提供的教科书。

        7
  •  1
  •   Dan Lew    15 年前

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

    第二,我质疑从功能编码到命令式编码的转换是否容易。我觉得事情不会像你想象的那么简单。

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

        8
  •  1
  •   Simon Broadhead    15 年前

    命令式编程的清晰控制流程有助于在教学环境中实现和分析算法。面向对象编程是对它的一种方便的扩展,所以它自然是最常用的。另一方面,函数式编程(实际上是任何类型的声明式编程)是一个完全独立的范例,它需要一整套新的考虑因素(性能和其他方面),如果您首先理解命令式编程,那么其中许多因素更容易可视化。毕竟,归根结底,它归结为一种命令式语言。

        9
  •  1
  •   yetanotherdave    15 年前

    学校里的课程必须有一个历史的角度来显示我的年龄。功能性是我开始学习的全部内容。

    但把这些放在一边,你必须从某个地方开始,所以其中一个必须是第一个。如果你从命令开始,那么当你学习功能性的东西时,你所能达到的东西将不在那里,你将不得不习惯于以不同的方式做事情。如果您从功能性开始,然后转向命令式,那么您必须习惯于学习新的概念/结构,并记住它们是它所使用的。

    每当你在编程时,你都试图解决一个问题。把这两个都放在工具箱里是很好的,可以用来解决手头的问题。这就是为什么我认为最好从IMeractive开始,然后学习实用性:如果你发现自己在寻求一些不存在的东西,那就意味着选择了错误的工具来解决你的问题。

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

        10
  •  1
  •   L33tminion    15 年前

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

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

        11
  •  0
  •   dirkgently    15 年前

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

    虽然我没有幸运地从一种功能性语言开始,但我确实有同事这样做了。我还有一个朋友学数学,他上学时唯一学的语言就是哈斯克尔!

    实际上有两件事:计算机科学和计算机工程。虽然这条线很细,但在我看来,它很大程度上取决于课程(如上所述)和相关部门的重点领域,即用哪种语言来切齿。大多数工程学校从C、C++或Java开始,它们的就业市场潜力很大。其他,可以从Lisp、Haskell等开始。

        12
  •  0
  •   Rayne    15 年前

    大多数大学都教授函数式编程。高中不教这门课的部分原因可能是因为“函数式编程很难”的神话。

        13
  •  0
  •   shoosh    15 年前

    在我的本科学习中不知道你的学校 ML 是基础编程语言课程的重要组成部分,还有专门为哈斯克尔开设的额外课程。

        14
  •  0
  •   simon    15 年前

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

    如果一个入门课程的目标是教授基本的计算机科学、算法、以编程方式解决问题,那么你的课程是基础课程,你可以根据清晰、简单和理解你的想法来选择一门课程。一些函数式语言将非常适合这一点。尤其是如果学生以前的经验很少或没有。

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

    所以我认为你想把你的问题抛在脑后。弄清楚这门课程实际上想要达到什么样的目的,并为这个目的选择最好的语言。在某些情况下,这可能是一种功能性语言。

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

        15
  •  0
  •   stormianrootsolver    14 年前

    我想,应该是的。

    另外-没有控制台应用程序和“调色板混音器”,但先进行单元测试。

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

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

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

    其次,在OOP环境中教他们命令式/功能性混合样式,并充分使用和解释设计模式。

    然后-只有这样他们才能尝试把点击按钮放在某个地方,也许作为奖励。但首先是理论和良好的编码实践。否则,我们会创建下一代“rad”-受害者甚至不能正确使用缩进,并将ctrl+c/ctrl+v错误地用于软件开发。