【问题标题】:What are the benefits of functional programming? [closed]函数式编程有什么好处? [关闭]
【发布时间】:2010-09-12 18:51:39
【问题描述】:

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

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

【问题讨论】:

标签: functional-programming


【解决方案1】:

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

摘要

随着软件变得越来越复杂,它也越来越多 更重要的是结构好。结构良好的软件很容易 编写和调试,并提供一组模块,可以 重复使用以减少未来的编程成本。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

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

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

          【讨论】:

            【解决方案6】:

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

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

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

            干杯, 乔恩·哈罗普。

            【讨论】:

              【解决方案7】:

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

              【讨论】:

              • 这是学习它的好处,而不是范式本身的好处
              • 但它们真的是分开的吗?从最初的提问者的角度来看,我会说不是——他们很可能是在努力学习一门函数式语言的过程中寻找好处。
              • “这是学习它的好处,而不是范式本身的好处”。该范例将渗透到您的其他 OOP 工作中,并有助于简化您的开发。您可以从“从这个输入计算这个输出”和“组合这两个计算新数据的函数”来解决问题,而不是“等待——那里的某个共享变量的状态是什么?”和“我是否让这些程序以正确的顺序执行?”。说真的,你可以在 Python、C#、C++、Java 中获得这些好处(通过理解 FP 范式)。
              【解决方案8】:

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

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

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

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

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

              【讨论】:

              • 我觉得你的第一段更接近于描述像 Prolog 这样的声明式关系编程而不是函数式编程。
              • @McPherrinM:函数式语言是声明式的,而不是命令式的。
              • 看来你是confusing DP vs. IP, with procedural vs. FP。 FP 通过强调函数组合来提供关注点分离,即分离确定性计算的子计算之间的依赖关系。
              • @LieRyan 不正确。请参阅我之前评论中的链接
              • 并发是有多个线程可以相互交互,这是势在必行的。同时进行多个独立计算称为并行。见en.wikipedia.org/wiki/Concurrency_(computer_science)
              【解决方案9】:

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

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

              【讨论】:

                猜你喜欢
                • 2023-03-02
                • 2010-09-06
                • 1970-01-01
                • 2013-08-16
                • 2010-09-06
                • 2014-02-24
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多