这是Eric Normand 的论文的业余翻译,Eric Normand是促进函数式编程的顾问兼发言人。
我对这些术语非常自由,毫不犹豫地将英语主义用作“功能”。 我对程序员术语的字面意思感到困惑。 享受阅读
简介:我们直接回答了这个问题,但是随后我们分析了隐藏在它后面的偏见。
经验丰富的开发人员经常会问我:“函数式编程能给我带来什么,而我还没有?我能以自己的语言开始使用FP吗?” 这是一个很好的问题,我希望我能给出一个不错的答案。
我完全了解此问题的外观。 JavaScript具有map
, filter
和reduce
。 Java 8具有流 ( 我决定使用 英语 而不是单词“ stream”-大约是Translator )。 似乎每种语言都具有越来越多的功能,包括 不变的数据结构 ,一阶函数,函数组成,解构和良好的键入。
我同意: 您可以使用任何语言的FP 。
函数式编程只是一个范例。 正如您可以以任何语言以过程,面向对象或逻辑风格进行编写一样,您也可以以任何语言以功能性风格进行编写。
等一下 这就是问题的答案。 就是这么简单吗?
问问自己:我可以在C语言中使用OOP吗? 根据我上面所说,答案是肯定的。 而且,我已经在C中制作了小型对象系统。 但是,如果可以使用C语言的对象,那为什么还需要一种面向对象的语言呢? 感觉就像我的对象系统为我提供了OOP所需的所有功能。 但是,还有另一个问题:我可以在不了解OOP的情况下在C中使用OOP吗? 我对此表示怀疑。
这些范式称为范式,因为 这些是解决问题的整体方法。 OOP将任务分为通过消息相互交互的对象。 FP将任务表示为显示模拟过程状态的数据。 程序方法将解决方案描述为一组清晰的步骤。 每个范例都提供了解决问题的不同方法。 如果您认为无需成为FP专家就可以在Java中使用FP,那么您可以说函数式编程不是范式,而只是一组功能(不可变数据,纯函数,它们的组成等)。
我遇到过很多次了。 人们声称以JavaScript编写功能样式。 实际上,它们只是使用map
和reduce
再加上许多纯函数 。 它给出了很好的结果,但是总的来说,它们的代码是过程性的。 他们不是研究范式,而是研究其特征。
严格地强加范式的语言的优点在于,它教会您使用这种方法来解决问题。 而且他施加的次数越多,您将不得不越频繁地尝试在此范式框架内解决问题。 语言的功能越多,使用功能性方法解决问题的练习就越多。 OOP和程序样式也是如此。 简而言之,您将无法使用惯用的方法进行训练。
让我做一个更具争议的声明:在功能性语言(Clojure,Haskell,Elm,Scala,Erlang等)之外,没有使用很多FP。 除非开发人员已经熟悉功能样式,否则由于拥有丰富的经验,他们只使用了范式提供的内容。 他们错过了最重要的事情:从不同角度看待任务的机会。
我并不是说实际上不可能使用JavaScript学习FP,但这将需要自律和帮助 。 语言不会引导您走这条路。 您将必须自己做,或找一个可以帮助您的人。
结论
所有范例都很出色,因为 一个观点相当于80个智商观点 。 “ 您可以使用任何语言的任何范例。 但是,不深入研究范式是非常困难的。 而且,如果不使用强行使用的语言,则很难潜水。 在执行此操作之前,您将使用范例的功能,但不会以新的方式解决问题。 通常,函数式编程不是一组功能。 如果您想学习它,请沉浸其中。