102

你认为函数式编程的好处是什么?它们如何适用于今天的程序员?

函数式编程和 OOP 之间最大的区别是什么?

4

9 回答 9

79

函数式编程的风格是描述你想要什么,而不是如何得到它。即:而不是创建一个带有迭代器变量的for循环并通过一个数组对每个单元格做一些事情,你会说相当于“这个标签是指这个数组的一个版本,这个函数已经在所有的元素。”

函数式编程将更多基本的编程思想转移到编译器中,例如列表推导和缓存等思想。

函数式编程的最大好处是简洁,因为代码可以更简洁。函数式程序不会创建迭代器变量作为循环的中心,因此可以从代码中消除这种和其他类型的开销。

另一个主要好处是并发性,这更容易通过函数式编程实现,因为编译器正在处理大多数过去需要手动设置状态变量的操作(如循环中的迭代器)。

在单处理器的上下文中也可以看到一些性能优势,这取决于程序的编写方式,因为大多数函数式语言和扩展都支持惰性求值。在 Haskell 中,你可以说“这个标签代表一个包含所有偶数的数组”。这样的数组无限大,但您可以随时请求该数组的第 100,000 个元素,而无需知道 - 在数组初始化时 - 您需要的最大值是多少。该值仅在您需要时计算,不再计算。

于 2008-09-24T16:14:36.327 回答
30

最大的好处是它不是你习惯的。选择一门像 Scheme 这样的语言并学习用它解决问题,你将成为使用你已经知道的语言的更好的程序员。这就像学习第二人类语言。您假设其他人基本上是您自己的变体,因为您没有什么可以与之比较的。与他人接触,特别是与你已经知道的无关的,是有启发性的。

于 2008-09-24T16:16:53.653 回答
12

为什么函数式编程很重要
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

抽象的

随着软件变得越来越复杂,良好的结构变得越来越重要。结构良好的软件易于编写和调试,并提供一组可重复使用的模块,以降低未来的编程成本。

在本文中,我们展示了函数式语言的两个特性,特别是高阶函数和惰性求值,可以显着促进模块化。作为示例,我们操作列表和树,编写多种数值算法,并实现 alpha-beta 启发式(人工智能中用于游戏程序的算法)。我们得出结论,由于模块化是成功编程的关键,因此函数式编程为软件开发提供了重要优势。

于 2010-05-23T18:29:55.057 回答
11

因此,一个好的起点是尝试理解一些在命令式语言中不可能但在函数式语言中可能的事情。

如果您在谈论可计算性,那么在函数式编程中当然没有什么是可能的但不是命令式编程(反之亦然)。

不同编程范式的重点不是让以前不可能的事情成为可能,而是让以前很难的事情变得容易。

函数式编程旨在让您更轻松地编写简洁、无错误和可并行化的程序。

于 2010-05-23T18:31:16.770 回答
6

它不必是其中之一:使用像 C#3.0 这样的语言可以让您混合每种最好的元素。OO可用于类级及以上的大规模结构,Functional style用于方法级的小规模结构。

使用Functional风格可以写出明确表达意图的代码,而不会与控制流语句等混淆。由于无副作用编程等原则,更容易对代码进行推理,并检查其正确性.

于 2008-09-24T16:10:46.880 回答
6

我认为需要函数式编程的最实际例子是并发性——函数式程序自然是线程安全的,并且考虑到多核硬件的兴起,这是极其重要的。

函数式编程还增加了模块化——你经常可以看到命令式的方法/函数太长——你几乎永远不会看到一个函数超过几行。而且由于一切都是解耦的 - 可重用性得到了很大改善,并且单元测试非常容易。

于 2010-05-23T18:25:04.947 回答
4

一旦程序增长,我们词汇表中的命令数量就会变得过多,从而使其非常难以使用。这就是面向对象编程让我们的生活更轻松的地方,因为它允许我们以更好的方式组织命令。我们可以将所有涉及客户的命令与某个客户实体(一个类)相关联,这使得描述更加清晰。但是,该程序仍然是一系列命令,指定它应该如何进行。

函数式编程提供了一种完全不同的扩展词汇表的方式。不限于添加新的原始命令;我们还可以添加新的控制结构——指定如何将命令组合在一起以创建程序的原语。在命令式语言中,我们能够按顺序或使用有限数量的内置结构(例如循环)来编写命令,但是如果您查看典型的程序,您仍然会看到许多重复的结构;组合命令的常用方法

于 2011-08-10T20:40:55.930 回答
2

不要从“需要”的角度来考虑函数式编程。相反,将其视为另一种编程技术,就像 OOP、模板、汇编语言等在您学习它们时(如果)完全改变了您的思维方式一样,它会打开您的思维。最终,学习函数式编程会让你成为一个更好的程序员。

于 2010-05-23T18:37:33.193 回答
0

如果您还不了解函数式编程,那么学习它可以为您提供更多解决问题的方法。

FP 是一种简单的泛化,将函数提升为一流的值,而 OOP 用于代码的大规模结构化。然而,存在一些重叠,其中 OOP 设计模式可以直接使用一流的函数更简洁地表示。

许多语言同时提供 FP 和 OOP,包括 OCaml、C# 3.0 和 F#。

干杯,乔恩·哈罗普。

于 2008-10-19T04:59:48.043 回答