Answers:
一个主要的问题是,如果您从Haskell之类的语言开始,其他所有内容似乎都不合格。
老实说,我认为以Haskell或scheme之类的语言开始将是一个好主意。
(我承认我是函数语言瘾君子)编辑:
好的,我喜欢这两种语言:
Scheme采用了非常简单的语言,并在其基础上构建了非常强大的开发语言。SICP还编写了有关方案的文章,因此值得在那里学习。Scheme是您可以想象的最简单的事情,它可能是一门完整的语言。
Haskell 我真正成长的是类型系统。我用其他语言看到的许多错误都是由于某个地方显示的错误类型引起的。在Haskell中,这几乎是不可能的。懒惰的语言的想法也有一些很酷的东西。例如,您可以在Haskell中创建无限数据结构,然后仅创建所需的零件。
在学习OOP语言之前学习功能语言的最大好处是,您的编程技能将首先得到发展,然后您可以轻松地掌握OOP概念。如果您不熟悉OOP语言,那么您将必须同时学习两件事:“思考代码”和“思考OOD”。它可能会分散注意力。首先使用功能语言进行练习,并发展您的编程技能。然后学习OOP和其他范例。由于OOP旨在弥补结构化编程中的不足,因此更容易理解原因。这就是CS课程从C开始然后继续学习C ++的原因。
关于如何从函数式编程开始学习编程的问题,有两个经典建议:
第一个也是很明显的一个例子是Abelson和Sussman撰写的经典的《计算机程序的结构和解释》,它仍然是CS的最佳介绍之一,并使用Scheme从功能的角度进行了讲授。它是完全可在网上。如果您不从这里开始,那您应该到达这里。
最近的一个文本涵盖了大部分相同地在温和的步伐,以更加注重软件工程程序设计方法,马修Felleisen从球拍/ PLT队一帮其他的,它使用的球拍方言方案。它也可以在线获得,正在进行的第二版也是如此。本书的优点是可以与DrRacket编程环境一起使用,该环境为初学者和专家提供了非常友好的界面来尝试代码。
关于为什么要从函数式编程开始的问题,我想指出Bob Harper的Blog。卡内基·梅隆(Carnegie Mellon)最近重新设计了他们的CS课程,首先教了函数式编程,而Harper一直在他的博客中逐条介绍他们的进展。作为标准ML定义背后的人之一,很明显他是这样做的,并且他很好地说明了这样做的原因。
最后,我警告大家不要先学习Haskell,尽管其他人可能会不同意。虽然Haskell对FP的纯方法肯定会养成良好的习惯,但该语言对惰性计算的关注不一定适合初学者。作为程序员,您需要学习做的第一批也是最重要的事情之一是,通过查看源代码来确切地推断出您的程序正在做什么,以及解决同一问题的不同方法的相对成本。我的经验是,尽管您的里程可能会有所变化,但即使是经验丰富的程序员,Haskell的懒惰也使这两项活动都有些挑战。
从FP开始的主要优点(或无缺点)是,大多数概念也可以应用于命令式编程。 球拍领域使用视频游戏类比来教授功能和命令式概念,专门的学生不仅可以使用功能游戏(npi),还可以对条件,递归,循环,ADT和事件驱动的设计有深入的了解。这些概念在现代编程中几乎无处不在,并且不断使用。
但是,更重要的是学习如何使用高阶函数和数据类型对FP擅长的抽象进行编码。 通过归纳教学,如何设计程序采用了独特的方法。例如,学生fold
通过查看用于获取列表总和和乘积的代码,找到他们的共同点,并自己得出实现,来学习工作原理。
等同于上述OOP的对象可能涉及以下一个或多个:接口,抽象类,泛型,函子或(如果您做错了)单例。尽管这些是Java中完全可以接受的设计模式,但是恕我直言,它们不属于入门课程,而只是用来混淆基本原理。即使是刚接触FP语言的人,我也可以说,拥有强大的功能锚点使在日新月异的OOP中导航变得非常容易。
RACKETEERS
。不知道什么时候到期,对不起。
我认为学习编程语言时,学习材料,一些好的代码示例和指导者的可用性非常重要。根据您的情况,您可能会有一位可以教您的导师,等等。但我认为与主流语言相比,功能语言资源很少。这意味着与学习主流语言相比,您的学习进度会变慢。但是,如果您不着急,那么这不是问题。
考虑学习函数式编程语言的最重要原因可能是对代数数据类型的理解。心理映射将帮助建模OO类关系,甚至数据库设计。
对多核/多处理器系统的关注强调了并行算法的使用,并行算法可以在FP中更清晰,更简洁地表达。在接下来的一到二十年中,lambda语言分支的使用可能会大大增加。
但是也有一些常见的陷阱。相信FP更简单是一个大错误,因为在lambda演算中,尤其是在支持惰性求值的语言中,计算空间和时间复杂性以及提供停止证明可能更具挑战性。
因此,两者都要学习!也许更好:首先学习一种包含两者的语言,例如Scala。如果您不介意打领带的T恤和一点荷兰语的口音,也许您会发现MSDN上Erik Meijer博士的FP讲座很有用。