我在这里看到很多关于函数式语言之类的讨论。为什么要使用一种语言而不是“传统”语言?他们在哪些方面做得更好?他们最差的是什么?理想的函数式编程应用程序是什么?

有帮助吗?

解决方案

函数式语言使用与命令式语言和面向对象语言不同的范例。他们使用无副作用函数作为语言的基本构建块。这使得很多事情成为可能,并使很多事情变得更加困难(或者在大多数情况下与人们习惯的不同)。

函数式编程的最大优点之一是无副作用函数的执行顺序并不重要。例如,在 Erlang 中,这用于以非常透明的方式启用并发。由于函数式语言中的函数的行为与数学函数非常相似,因此很容易将它们转换为函数式语言。在某些情况下,这可以使代码更具可读性。

传统上,函数式编程的一大缺点也是缺乏副作用。如果没有 IO,编写有用的软件是非常困难的,但 IO 很难实现在功能上没有副作用。因此,大多数人从函数式编程中得到的收获,莫过于根据单个输入计算单个输出。在现代混合范式语言(如 F# 或 Scala)中,这更容易。

许多现代语言都具有函数式编程语言的元素。C# 3.0 具有许多函数式编程功能,您也可以在 Python 中进行函数式编程。我认为函数式编程流行的原因主要有两个原因:并发性正在成为普通编程中的一个真正问题,因为我们拥有越来越多的多处理器计算机。而且语言变得越来越容易使用。

其他提示

我认为函数式编程方法的“流行”没有任何问题,因为它(作为一种编程风格)已经使用了大约 40 年。每当 OO 程序员编写有利于不可变对象的干净代码时,该代码就在借用函数概念。

然而,语言 执行 如今,函数式风格正在获得大量虚拟墨水,而这些语言是否会在未来占据主导地位是一个悬而未决的问题。我自己的怀疑是混合的、多范式的语言,例如 斯卡拉 或者 奥卡米尔就像纯 OO 语言(Smalltalk、Beta 等)影响主流编程但并未最终成为最广泛使用的符号一样,它可能会主导“纯粹”函数式语言。

最后,我忍不住指出,你对 FP 的评论与我几年前从程序程序员那里听到的评论高度相似:

  • (恕我直言,神话)“普通”程序员不理解它。
  • 它没有被广泛教授。
  • 您可以用它编写的任何程序都可以使用当前技术以另一种方式编写。

正如图形用户界面和“代码作为业务模型”这些概念帮助 OO 得到更广泛的理解一样,我相信增加不变性和更简单(大规模)并行性的使用将帮助更多程序员看到函数式方法提供的好处。但正如我们所学到的 过去50年左右 尽管它们构成了数字计算机编程的整个历史,但我认为我们还有很多东西需要学习。二十年后,程序员将惊讶地发现我们当前使用的工具的原始性质, 包括 现在流行的OO和FP语言。

对我来说,主要的优点是它固有的并行性,特别是当我们现在从更多的 MHz 转向越来越多的内核时。

我不认为它会成为下一个编程范式并完全取代 OO 类型的方法,但我确实认为我们会达到这样的程度:我们需要用函数式语言编写一些代码,或者我们的通用语言将成长为包含更多功能性结构。

即使您从未专业使用函数式语言,理解函数式编程也会让您成为更好的开发人员。它会给你一个关于代码和编程的新视角。

我说没有理由不学。

我认为能够很好地混合函数式和命令式风格的语言是最有趣的,也最有可能成功。

我总是对下一件大事持怀疑态度。很多时候,下一件大事纯粹是历史的偶然,无论技术好坏,它都会在正确的时间出现在正确的地点。例子:C++、Tcl/Tk、Perl。所有有缺陷的技术都取得了巨大的成功,因为它们被认为要么解决了当今的问题,要么与根深蒂固的标准几乎相同,或者两者兼而有之。函数式编程可能确实很棒,但这并不意味着它会被采用。

但是我 告诉你为什么人们 兴奋的 关于函数式编程:很多很多程序员都有过一种“转换经验”,他们发现使用函数式语言可以使他们的工作效率提高一倍(或者可能提高十倍),同时生成的代码更能适应变化并且错误更少。这些人认为函数式编程是一种秘密武器;保罗·格雷厄姆(Paul Graham)就是这种心态的一个很好的例子 击败平均水平. 。哦,他的申请呢?电子商务网络应用程序。

自 2006 年初以来,关于函数式编程和并行性也出现了一些热议。既然人们喜欢 西蒙·佩顿·琼斯 至少从 1984 年起我就断断续续地担心并行性,直到函数式语言解决多核问题为止我都不会屏住呼吸。但它确实解释了目前一些额外的讨论。

总的来说,美国大学的函数式编程教学做得很差。有强大的核心支撑 使用Scheme教授入门编程, ,并且 Haskell 也在那里享有一些支持,但是在教授函数式程序员的高级技术方面却很少。我在哈佛大学教授过这样的课程,今年春天我将在塔夫茨大学再次教授这样的课程。本杰明·皮尔斯在宾夕法尼亚大学教授过这样的课程。我不知道保罗·胡达克在耶鲁大学是否做过任何事情。欧洲大学的表现要好得多;例如,丹麦、荷兰、瑞典和英国的重要地方都强调函数式编程。我对澳大利亚正在发生的事情不太了解。

我没有看到有人提到房间里的大象,所以我认为这取决于我:)

JavaScript 是一种函数式语言。随着越来越多的人使用 JS 做更高级的事情,特别是利用 jQuery、Dojo 和其他框架的优点,FP 将会被 Web 开发者的后门引入。

与闭包相结合,FP 使 JS 代码变得非常轻,但仍然具有可读性。

欢呼,ps

大多数应用程序都很简单,可以用普通的 OO 方式解决

  1. OO方式并不总是“正常”。这个十年的标准是过去十年的边缘化概念。

  2. 函数式编程是数学。 保罗·格雷厄姆论 Lisp (Lisp 的替代函数式编程):

因此,关于这种1950年代语言不过时的原因的简短解释是,它不是技术,而是数学,而数学并没有过时。对LISP进行比较的正确的是不是1950年代的硬件,而是在1960年发现的QuickSort算法,仍然是最快的通用类型。

我敢打赌,当您使用以下命令时,您并不知道自己正在进行函数式编程:

  • Excel 公式
  • 石英作曲家
  • JavaScript
  • 标志(海龟图形)
  • LINQ
  • SQL
  • underscore.js(或lodash),D3

普通的公司程序员,例如我与之合作的大多数人都不会理解它,并且大多数工作环境都不会让您编程

不过,这只是时间问题。一般的公司程序员都会了解当前的大事是什么。15 年前,他们不懂 OOP。如果 FP 流行起来,你的“普通企业程序员”也会效仿。

它不是真正在大学教授的(如今是?)

变化很大。在我的大学,SML 是学生接触到的第一种语言。我相信 MIT 将 LISP 作为一年级课程进行教授。当然,这两个例子可能不具有代表性,但我相信大多数大学至少都会提供一些关于 FP 的选修课程,即使他们没有将其作为课程的必修部分。

大多数应用程序都足够简单,可以以正常的方式解决

但这实际上并不是“足够简单”的问题。解决方案是 更简单 (或者更具可读性、健壮性、优雅性、高性能)在 FP 中?很多事情“足够简单,可以用 Java 解决”,但它仍然需要大量的代码。

无论如何,请记住,函数式编程的支持者几十年来一直声称它是下一件大事。也许他们是对的,但请记住,当他们在 5、10 或 15 年前提出同样的主张时,他们就不是对的。

不过,有一点绝对对他们有利,那就是最近 C# 急剧转向 FP,以至于它实际上将一代程序员转变为 FP 程序员, 他们甚至没有注意到. 。这可能会为 FP“革命”铺平道路。或许。;)

如果一个人看不到其他艺术的价值,他就无法理解他所选择的艺术的完美和不完美。遵循规则只能让技术发展到一定程度,然后学生和艺术家必须学习更多并寻求进一步的发展。研究其他艺术以及战略艺术是有意义的。

谁没有通过观察别人的活动来更多地了解自己?要学剑,就先学吉他。要学先学商。只研究剑,会使你心胸狭隘,不让你向外成长。

——宫本武藏《五轮书》

函数式语言的一个关键特性是一等函数的概念。这个想法是,您可以将函数作为参数传递给其他函数并将它们作为值返回。

函数式编程涉及编写不改变状态的代码。这样做的主要原因是连续调用函数将产生相同的结果。您可以用任何支持一等函数的语言编写函数代码,但有些语言(例如 Haskell)不允许您更改状态。事实上,你根本不应该产生任何副作用(比如打印出文本)——这听起来好像它可能完全没用。

Haskell 采用了一种不同的 IO 方法:单子。这些对象包含由解释器顶层执行的所需 IO 操作。在任何其他级别,它们只是系统中的对象。

函数式编程有哪些优点?函数式编程可以减少潜在错误的编码,因为每个组件都是完全隔离的。此外,使用递归和一等函数可以简单地证明正确性,这通常反映了代码的结构。

我不认为大多数现实的人认为函数式编程会流行(成为像 OO 这样的主要范例)。毕竟,大多数业务问题都不是漂亮的数学问题,而是复杂的命令式规则来移动数据并以各种方式显示它们,这意味着它不太适合纯函数式编程范式(monad 的学习曲线远远超过 OO)。

OTOH,函数式编程让编程变得有趣。它让你欣赏宇宙底层数学的简洁表达所固有的、永恒的美。人们说学习函数式编程会让你成为更好的程序员。这当然是非常主观的。我个人认为这也不完全正确。

它让你成为一个更好的有知觉的人。

我一定很笨,但我还是不明白。是否有使用 F# 等函数式语言编写的小型应用程序的实际示例,您可以在其中查看源代码并了解如何以及为什么使用这种方法比使用 C# 等方法更好?

我想指出的是,你所说的关于函数式语言的一切,大多数人大约 20 年前都在谈论面向对象语言。那时,很常见听到 OO:

* The average corporate programmer, e.g. most of the people I work with, will not understand it and most work environments will not let you program in it
* It's not really taught at universities (or is it nowadays?)
* Most applications are simple enough to be solved in normal IMPERATIVE ways

改变必须来自某个地方。无论接受过早期技术培训的人们是否认为变革是不必要的,有意义且重要的变革都会自行发生。尽管当时所有人都反对,但您认为面向对象的改变是好的吗?

F# 可能会流行起来,因为 Microsoft 正在推动它。

专业人士:

  • F# 将成为下一版本 Visual Studio 的一部分
  • Microsoft 建立社区已经有一段时间了 - 传播者、书籍、与知名客户合作的顾问、在 MS 会议上的大量曝光。
  • F# 是一流的 .Net 语言,它是第一个拥有真正强大基础的函数式语言(并不是说 Lisp、Haskell、Erlang、Scala、OCaml 没有很多库,它们只是不如 .Net 完整)是)
  • 对并行性的强大支持

魂斗罗:

  • 即使您擅长 C# 和 .Net,F# 也很难开始 - 至少对我来说:(
  • 可能很难找到优秀的 F# 开发人员

所以,我给了 F# 50:50 的机会让其变得重要。其他函数式语言在不久的将来不会成功。

我认为原因之一是 有些人认为一种语言是否会被接受最重要的是该语言有多好. 。不幸的是,事情很少如此简单。例如,我认为 Python 被接受的最大因素不是语言本身(尽管 非常重要)。Python 如此受欢迎的最大原因是其庞大的标准库和更大的第三方库社区。

像 Clojure 或 F# 这样的语言可能是这个规则的例外,因为它们是基于 JVM/CLR 构建的。结果,我没有给他们答案。

大多数应用程序都可以通过[插入您最喜欢的语言、范例等来解决。这里]。

虽然这是事实,但可以使用不同的工具来解决不同的问题。函数式只是允许另一个高(更高?)级别的抽象,当正确使用时,它可以更有效地完成我们的工作。

在我看来,那些本科时从未学过 Lisp 或Scheme 的人现在正在发现它。与该领域的许多事情一样,存在炒作和创造高期望的倾向......

会过去的。

函数式编程很棒。然而,它不会接管世界。C、C++、Java、C# 等仍将存在。

我认为这会带来更多的跨语言能力——例如用函数式语言实现一些东西,然后用其他语言提供对这些东西的访问。

在阅读《下一个主流编程语言:在 Epic Games 的 Tim Sweeney 的《游戏开发者视角》中,我的第一个想法是 - 我必须学习 Haskell。

PPT

Google 的 HTML 版本

一段时间以来,事情一直朝着功能性的方向发展。过去几年中的两个很酷的新孩子,Ruby 和 Python,都比它们之前的语言更加接近函数式语言,以至于一些 Lispers 已经开始支持其中一种“足够接近”。

随着大规模并行硬件给每个人带来了进化压力,而函数式语言是应对变化的最佳位置,认为 Haskell 或 F# 将成为下一个重大事件已经不再像以前那么遥远了。

您最近有关注编程语言的演变吗?所有主流编程语言的每个新版本似乎都从函数式编程中借用了越来越多的功能。

  • 闭包、匿名函数、将函数作为值传递和返回曾经是只有 Lisp 和 ML 黑客才知道的奇异功能。但逐渐地,C#、Delphi、Python、Perl、Javascript 都添加了对闭包的支持。任何新兴语言都不可能在没有闭包的情况下得到认真对待。

  • 多种语言,特别是 Python、C# 和 Ruby,都对列表推导式和列表生成器提供本机支持。

  • ML 于 1973 年开创了泛型编程,但对泛型(“参数多态性”)的支持直到最近 5 年左右才成为行业标准。如果我没记错的话,Fortran 在 2003 年支持泛型,随后 Java 2004 年、C# 在 2005 年、Delphi 在 2008 年。(我知道 C++ 自 1979 年以来就支持模板,但 90% 关于 C++ STL 的讨论都是从“这里有恶魔”开始的。)

是什么让这些功能对程序员有吸引力?这应该是显而易见的: 它可以帮助程序员编写更短的代码. 。如果未来的所有语言想要保持竞争力,它们至少都将支持闭包。从这方面来说,函数式编程已经成为主流。

大多数应用程序都足够简单,可以以正常的方式解决

谁说函数式编程不能用于简单的事情?并非每个功能程序都需要是编译器、定理证明器或大规模并行电信交换机。除了更复杂的项目之外,我还经常使用 F# 来处理临时的一次性脚本。

它之所以流行,是因为它是控制复杂性的最佳工具。看:
- Simon Peyton-Jones 演讲“A Taste of Haskell”的幻灯片 109-116
- “下一个主流编程语言:游戏开发者的视角”作者:Tim Sweeney

我同意第一点,但时代在变。即使公司是较晚采用者,如果他们看到有优势的话,他们也会做出反应。生活是动态的。

90 年代末,他们在斯坦福大学教授 Haskell 和 ML。我确信卡内基梅隆大学、麻省理工学院、斯坦福大学和其他优秀学校正在向学生展示它。

我同意大多数“在网络上公开关系数据库”应用程序将在很长一段时间内继续这种趋势。Java EE、.NET、RoR 和 PHP 已经针对这个问题开发了一些非常好的解决方案。

你发现了一些重要的事情:这可能是无法通过其他方法轻松解决的问题,这将促进函数式编程。那会是什么?

大规模的多核硬件和云计算会推动他们前进吗?

因为FP在生产率、可靠性和可维护性方面具有显着的优势。多核可能是一个杀手级应用程序,尽管存在大量遗留代码,但最终还是让大公司进行了转换。此外,由于多核问题,即使是像 C# 这样的大型商业语言也呈现出独特的功能风格 - 副作用很简单不太适合并发和并行。

我不同意“普通”程序员不会理解它。他们会的,就像他们最终理解 OOP 一样(这同样神秘和奇怪,甚至更奇怪)。

此外,大多数大学都教授 FP,许多大学甚至将其作为第一门编程课程。

哇——这是一个有趣的讨论。对此我个人的想法:

FP 使某些任务相对简单(与非 FP 语言相比)。非 FP 语言已经开始从 FP 中汲取想法,所以我怀疑这种趋势将继续下去,我们将看到更多的合并,这应该可以帮助人们更容易地跳跃到 FP。

我不知道它是否会流行,但从我的调查来看,函数式语言几乎肯定值得学习,并且会让你成为更好的程序员。只要理解引用透明度就可以使许多设计决策变得更加容易,并且生成的程序也更容易推理。基本上,如果您遇到问题,那么它往往只是单个函数的输出问题,而不是状态不一致的问题,这可能是由数百个类/方法/函数中的任何一个引起的使用具有副作用的比较语言。

FP 的无状态特性更自然地映射到 Web 的无状态特性,因此函数式语言更容易构建更优雅、更安静的 Web 应用程序。与 JAVA 和 .NET 框架形成鲜明对比的是,JAVA 和 .NET 框架需要诉诸极其丑陋的 HACK(如 VIEWSTATE 和 SESSION 键)来维护应用程序状态,并在本质上无状态的功能平台(如 Web)上维护有状态命令式语言的抽象(有时非常泄漏)。

而且,您的应用程序越无状态,就越容易进行并行处理。如果您的网站碰巧流行起来,这对网络来说非常重要。仅仅向站点添加更多硬件以获得更好的性能并不总是那么简单。

我的观点是,既然微软已经将它进一步推向主流,它就会流行起来。对我来说,它很有吸引力,因为它能为我们做些什么,因为这是一个新的挑战,也因为它对未来的就业机会感到不满。

一旦掌握,它将成为进一步帮助我们提高程序员生产力的另一个工具。

讨论中遗漏的一点是,最好的类型系统是在当代 FP 语言中找到的。更重要的是,编译器可以自动推断所有(或至少大多数)类型。

有趣的是,在进行 Java 编程时,人们要花一半的时间来编写类型名称,但 Java 到目前为止还不是类型安全的。虽然您可能永远不会在 Haskell 程序中编写类型(除非作为一种编译器检查文档),但代码是 100% 类型安全的。

除了其他答案之外,用纯函数术语来表达解决方案迫使人们更好地理解问题。相反,以函数式思维将培养更好的*解决问题的能力。

*要么是因为功能范例更好,要么是因为它将提供额外的攻击角度。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top