函数式编程的好处是什么?[关闭]


95

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

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



Answers:


75

函数式编程的风格是描述您想要的东西,而不是如何获得它。即:不是说用迭代器变量创建for循环并遍历数组对每个单元格做事,而是说“等效于此标签指的是该数组的一个版本,其中所有元素。”

函数式编程将更基本的编程思想(例如列表推导和缓存)移入了编译器。

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

另一个主要好处是并发性,并发性更易于使用函数式编程,因为编译器会处理大多数以前需要手动设置状态变量的操作(例如循环中的迭代器)。

在某些情况下,也可以在单处理器环境中看到一些性能优势,这取决于程序的编写方式,因为大多数功能语言和扩展都支持延迟评估。在Haskell中,您可以说“此标签代表包含所有偶数的数组”。这样的数组是无限大的,但是您可以随时请求该数组的第100,000个元素,而不必在数组初始化时知道​​您将需要的最大值是多少。仅在需要时才计算该值,而不会进行进一步计算。


12
我觉得您的第一段比函数式编程更接近于描述像Prolog这样的声明性关系编程。
McPherrinM

6
@McPherrinM:函数式语言是声明性的,而不是命令性的。
Lie Ryan

2
似乎您将DP与IP,程序与FP混淆了。FP通过强调功能组合(即,将确定性计算的子计算之间的依赖关系分离)来提供关注点分离。
谢尔比·摩尔三世

2
@LieRyan错误。请查看我之前的评论中的链接
谢尔比·摩尔三世

并发具有多个可能相互交互的线程,这是必须的。同时执行多个独立的计算称为并行性。见en.wikipedia.org/wiki/Concurrency_(computer_science)
拉姆达仙女

29

最大的好处是,这不是您所习惯的。选择像Scheme这样的语言并学习解决其问题,您将成为使用已经知道的语言的更好的程序员。就像学习第二种人类语言一样。您认为其他人基本上就是您自己的变体,因为您没有可与之比较的东西。暴露于他人(特别是与您所知道的事物无关的事物)具有启发性。


28
这是学习它的好处,而不是范式本身的好处
Moe

2
但是它们真的分开吗?从原始提问者的角度来看,我不会说-他们很可能会在学习功能语言的全部努力中寻求收益。
肯德尔·赫尔姆斯特·盖尔纳

3
“这是学习它的好处,而不是范式本身的好处”。该范例将泄漏到您的其他OOP工作中,并可以帮助简化那里的开发。您可以通过“从此输入计算此输出”和“组成这两个计算新数据的函数”而不是“等待-那里的某些共享变量的状态是什么”来解决问题。和“我是否按照正确的顺序执行了这些程序?”。认真地说,您可以使用Python,C#,C ++,Java获得这些好处(通过了解FP范例)。
Jared Updike

11

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

抽象

随着软件变得越来越复杂,良好地构建软件就变得越来越重要。结构良好的软件易于编写和调试,并提供了可重复使用的模块集合,以减少未来的编程成本。

在本文中,我们证明了功能语言的两个特征,特别是高阶函数和惰性求值,可以极大地促进模块化。例如,我们操纵列表和树,编写几种数值算法,并实现alpha-beta启发式(一种来自AI的算法,用于游戏程序)。我们得出结论,由于模块化是成功编程的关键,因此函数式编程为软件开发提供了重要的优势。


10

因此,一个好的出发点是尝试理解某些命令式语言不可能实现但功能语言可能实现的东西。

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

不同编程范例的意义并不是要使以前不可能的事情变成可能,而是要使以前很难的事情变得容易。

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


5

不必一定要是另一种:使用C#3.0之类的语言,您可以混合每个元素的最佳元素。OO可用于类级别及更高级别的大型结构,功能样式可用于方法级别的小型结构。

使用Functional样式可以编写清楚地声明其意图的代码,而不会与控制流语句等混淆。由于诸如副作用自由编程之类的原理,推理代码和检查其正确性要容易得多。 。


5

我认为功能编程需求的最实际例子是并发-功能程序自然是线程安全的,并且鉴于多核硬件的兴起,这是最重要的。

函数式编程还提高了模块性-您经常会看到命令/函数太长了-您几乎看不到函数多于几行。而且,由于一切都是解耦的,因此可重用性得到了极大改善,单元测试非常简单。


3

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

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


1

不要以“需求”来考虑函数式编程。相反,可以将它视为另一种编程技术,它会像OOP,模板,汇编语言等可能完全改变您的思维方式(如果您学会了它们)一样打开您的视野。最终,学习函数式编程将使您成为一个更好的程序员。


0

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

FP是一种简单的概括,可以将函数提升为一等值,而OOP用于大规模的代码结构化。但是,存在一些重叠之处,在这些重叠中,可以使用一流的功能直接且更简洁地表示OOP设计模式。

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

干杯,乔恩·哈罗普。

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.