作为第一语言的功能


Answers:


16

一个主要的问题是,如果您从Haskell之类的语言开始,其他所有内容似乎都不合格。

老实说,我认为以Haskell或scheme之类的语言开始将是一个好主意。

(我承认我是函数语言瘾君子)编辑:

好的,我喜欢这两种语言:

Scheme采用了非常简单的语言,并在其基础上构建了非常强大的开发语言。SICP还编写了有关方案的文章,因此值得在那里学习。Scheme是您可以想象的最简单的事情,它可能是一门完整的语言。

Haskell 我真正成长的是类型系统。我用其他语言看到的许多错误都是由于某个地方显示的错误类型引起的。在Haskell中,这几乎是不可能的。懒惰的语言的想法也有一些很酷的东西。例如,您可以在Haskell中创建无限数据结构,然后仅创建所需的零件。


公平地讲,一大堆语言都包含了越来越多的功能方面,因此生活不再像以前那样糟糕。
蒂洪·耶尔维斯

没错,对于爱FP的人来说,这不过是一件好事
Zachary K

3
我知道-我建议这是一个很好的理由第一次学习FP。这种趋势让我很开心了一段时间。
蒂洪·耶尔维斯

不过,实际上并没有说太多回答- 您为什么喜欢Haskell(或Scheme)?他们会成为学习的第一语言吗?为什么?
jimwise 2011年

添加了关于这两种语言的一些评论
Zachary K

6

在学习OOP语言之前学习功能语言的最大好处是,您的编程技能将首先得到发展,然后您可以轻松地掌握OOP概念。如果您不熟悉OOP语言,那么您将必须同时学习两件事:“思考代码”和“思考OOD”。它可能会分散注意力。首先使用功能语言进行练习,并发展您的编程技能。然后学习OOP和其他范例。由于OOP旨在弥补结构化编程中的不足,因此更容易理解原因。这就是CS课程从C开始然后继续学习C ++的原因。


1
在我的大学里,我们首先从功能语言Standard ML开始,并了解了副作用。之后,我们学习了C,但从未学习过C ++。
乔纳斯(Jonas)

@乔纳斯 我猜想不同的国家/大学的课程结构非常不同。在我的大学中,C紧跟C ++是Comuter Science Engg课程的标准,但是对于其他工程流,只讲C。
DPD

在我的大学里,我们从Java开始,然后再使用适合该课程的语言。例如,C / C ++用于系统编程,C#用于UI,计算机组织使用各种汇编语言,我认为您想要进行游戏编程的一切
Carson Myers

在我的大学,我们从学习计划(使用SICP)开始。前几周完全正常运作;OOP很好地引入了课程。我认为课程安排得非常好,因此很喜欢这门课程。
蒂洪·耶尔维斯

6

关于如何从函数式编程开始学习编程的问题,有两个经典建议:

  • 第一个也是很明显的一个例子是Abelson和Sussman撰写的经典的《计算机程序的结构和解释》,它仍然是CS的最佳介绍之一,并使用Scheme从功能的角度进行了讲授。它是完全可在网上。如果您不从这里开始,那您应该到达这里。

  • 最近的一个文本涵盖了大部分相同地在温和的步伐,以更加注重软件工程程序设计方法,马修Felleisen从球拍/ PLT队一帮其他的,它使用的球拍方言方案。它也可以在线获得,正在进行的第二版也是如此。本书的优点是可以与DrRacket编程环境一起使用,该环境为初学者和专家提供了非常友好的界面来尝试代码。

关于为什么要从函数式编程开始的问题,我想指出Bob Harper的Blog。卡内基·梅隆(Carnegie Mellon)最近重新设计了他们的CS课程,首先教了函数式编程,而Harper一直在他的博客中逐条介绍他们的进展。作为标准ML定义背后的人之一,很明显他是这样做的,并且他很好地说明了这样做的原因。

最后,我警告大家不要先学习Haskell,尽管其他人可能会不同意。虽然Haskell对FP的纯方法肯定会养成良好的习惯,但该语言对惰性计算的关注不一定适合初学者。作为程序员,您需要学习做的第一批也是最重要的事情之一是,通过查看源代码来确切地推断出您的程序正在做什么,以及解决同一问题的不同方法的相对成本。我的经验是,尽管您的里程可能会有所变化,但即使是经验丰富的程序员,Haskell的懒惰也使这两项活动都有些挑战。


5

从FP开始的主要优点(或无缺点)是,大多数概念也可以应用于命令式编程。 球拍领域使用视频游戏类比来教授功能和命令式概念,专门的学生不仅可以使用功能游戏(npi),还可以对条件,递归,循环,ADT和事件驱动的设计有深入的了解。这些概念在现代编程中几乎无处不在,并且不断使用。

但是,更重要的是学习如何使用高阶函数和数据类型对FP擅长的抽象进行编码。 通过归纳教学,如何设计程序采用了独特的方法。例如,学生fold通过查看用于获取列表总和和乘积的代码,找到他们的共同点,并自己得出实现,来学习工作原理。

等同于上述OOP的对象可能涉及以下一个或多个:接口,抽象类,泛型,函子或(如果您做错了)单例。尽管这些是Java中完全可以接受的设计模式,但是恕我直言,它们不属于入门课程,而只是用来混淆基本原理。即使是刚接触FP语言的人,我也可以说,拥有强大的功能锚点使在日新月异的OOP中导航变得非常容易。


差点忘了:如果您想购买球拍领域,请尝试以下优惠券:RACKETEERS。不知道什么时候到期,对不起。
错误

+1提及高阶函数-我准备发表自己的回答。我有一半的同事都在为这个概念而苦苦挣扎,而其他真正做到这一点的人却不会想到它们何时才是最简单的解决方案。
2013年

1
我没有听说过球拍领域,但从书名中就立刻知道这是什么,因为书名是对它的哥哥Lisp的引用。
Magus 2014年

4

函数式编程使事情变得容易得多。在OOP语言中,您必须处理多个线程之间的状态管理,而又不破坏状态。在函数式语言中,当大多数工作是由纯函数完成时,您不必担心。

在速度/性能方面,我并不是真正的性能骑师,但发挥功能并不意味着速度慢,而功能语言的结构与其速度无关。功能语言的语法差异很大,例如Clojure和Haskell之间的差异。Clojure的运行速度非常快,通过事后优化可以达到(有时超过)Java的速度。

所以这真的取决于您要寻找的东西


2

我认为学习编程语言时,学习材料,一些好的代码示例和指导者的可用性非常重要。根据您的情况,您可能会有一位可以教您的导师,等等。但我认为与主流语言相比,功能语言资源很少。这意味着与学习主流语言相比,您的学习进度会变慢。但是,如果您不着急,那么这不是问题。


1
我认为您的假设是错误的。这里很好的教程,书籍,论文等有关功能性的东西。而且,有很多论文涉及特殊的事情,例如类型系统,实现,虚拟机,lambda演算等等。
Ingo

1

考虑学习函数式编程语言的最重要原因可能是对代数数据类型的理解。心理映射将帮助建模OO类关系,甚至数据库设计。

对多核/多处理器系统的关注强调了并行算法的使用,并行算法可以在FP中更清晰,更简洁地表达。在接下来的一到二十年中,lambda语言分支的使用可能会大大增加。

但是也有一些常见的陷阱。相信FP更简单是一个大错误,因为在lambda演算中,尤其是在支持惰性求值的语言中,计算空间和时间复杂性以及提供停止证明可能更具挑战性。

因此,两者都要学习!也许更好:首先学习一种包含两者的语言,例如Scala。如果您不介意打领带的T恤和一点荷兰语的口音,也许您会发现MSDN上Erik Meijer博士FP讲座很有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.