为什么开发人员喜欢函数式编程?

Posted 技福教育

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么开发人员喜欢函数式编程?相关的知识,希望对你有一定的参考价值。


函数式编程已经存在了60年,但到目前为止它一直只是一个小众现象。虽然像谷歌这样的游戏改变者依赖于它的关键概念,但是今天的普通程序员对它知之甚少,甚至一无所知。
这种情况即将改变。不仅像Java或Python这样的语言采用了越来越多的函数式编程的概念。较新的语言如Haskell正在走向完全函数化。

为什么开发人员喜欢函数式编程?


简单地说,函数式编程就是为不可变变量构建函数。相反,面向对象编程是关于拥有一组相对固定的函数,您主要是修改或添加新的变量。

由于函数式编程的本质,它非常适合于急需的任务,比如数据分析和机器学习。这并不意味着您应该与面向对象编程说再见,而应该完全采用函数式编程。但是,了解这些基本原则是很有用的,这样你就可以在适当的时候利用它们。


为什么开发人员喜欢函数式编程?


为什么开发人员喜欢函数式编程?
关于消除副作用
要理解函数式编程,我们首先需要理解函数。这听起来可能很无聊,但说到底,这还是很有见地的。
简单地说,函数是将一些输入转换为一些输出的东西。但事情并不总是那么简单。想一下Python中的这个函数:

为什么开发人员喜欢函数式编程?

这个功能是哑而简单的;它取一个变量x,可能是int,或者浮点数或者双精度数,然后给出它的平方。
现在想想这个函数:

为什么开发人员喜欢函数式编程?

乍一看,这个函数似乎接受了一个变量x,无论它是什么类型的,并且没有返回任何东西,因为没有返回语句。但是等等!
如果之前没有定义global_list,该函数将无法工作,它的输出是相同的列表,尽管是修改过的。尽管global_list从未被声明为输入,但当我们使用这个函数时,它会改变:

为什么开发人员喜欢函数式编程?

它返回的不是空列表,而是[1,2]。这表明列表确实是函数的输入,尽管我们没有明确说明。这可能是个问题。

对功能不诚实
这些隐含的输入——或者在其他情况下的输出——有一个正式名称:副作用。虽然我们使用的只是一个简单的示例,但在更复杂的程序中,这些可能会造成真正的困难。
考虑一下如何测试append_to_list:除了阅读第一行并用任何x测试函数,您需要阅读整个定义,了解它所做的事情,定义global_list,并以这种方式测试它。在这个示例中,简单的是,当您处理数千行代码的程序时,它很快就会变得乏味。
好消息是,有一个简单的解决办法:诚实地知道函数作为输入的作用。这好多了:

为什么开发人员喜欢函数式编程?

我们并没有太大变化。输出仍然是[1,2],其他一切也保持不变。
不过,我们改变了一件事:代码现在没有副作用了。这是个好消息。
当你看到函数声明的时候,你就会知道到底发生了什么。因此,如果程序没有按预期运行,您可以轻松地单独测试每个函数并查明哪一个是错误的。

函数式编程是编写纯函数
在和输出中明确声明的函数是没有副作用的函数。没有副作用的函数是纯函数。
函数式编程的一个非常简单的定义是:仅用纯函数编写程序。纯函数从不修改变量,而只创建新变量作为输出。(我在上面的例子中作弊了一点:它遵循函数式编程,但仍然使用全局列表。你可以找到更好的例子,但这里是关于基本原则的。)
此外,您可以期望具有给定输入的纯函数具有特定的输出。相反,非纯函数可能依赖于某些全局变量;因此,如果全局变量不同,相同的输入变量可能会导致不同的输出。后者会使代码的调试和维护更加困难。
有一个简单的规则可以发现副作用:由于每个函数都必须有某种in- and - output,没有任何in- or - output的函数声明必须是不纯的。如果采用函数式编程,这些是您可能需要更改的第一个声明。
函数式编程不仅仅是 Map和reduce。
循环不是函数式编程中的东西。考虑一下这些Python循环:

为什么开发人员喜欢函数式编程?

对于您正在尝试执行的简单操作,这段代码相当长。它也不是功能性的,因为你在修改全局变量。
相反,考虑一下:

为什么开发人员喜欢函数式编程?

这是全功能的。它是短的。它更快,因为不需要遍历数组中的许多元素。一旦您理解了如何过滤、映射和减少工作,代码也就不难理解了。
这并不意味着所有的功能代码都使用map、reduce等。这并不意味着您也需要函数式编程来理解map和reduce。只是当你抽象循环时,这些函数会经常出现。

为什么开发人员喜欢函数式编程?


Lambda函数
当谈到函数式编程的历史时,很多人都会从lambda函数的发明开始。尽管lambdas无疑是函数式编程的基石,但它们不是根本原因。
Lambda函数是可以用来使程序具有函数性的工具。但是您也可以在面向对象编程中使用lambdas。

静态类型
上面的示例不是静态类型的。然而,它是功能性的。
尽管静态类型为代码增加了额外的安全层,但使其发挥功能并不是必需的。不过,它可以是一个不错的附加功能。
有些语言变得比其他语言更实用

Perl

Perl采用一种与大多数编程语言非常不同的方法来处理副作用。它包含一个神奇的参数$_,它使副作用成为其核心特性之一。Perl确实有它的优点,但是我不会尝试用它进行函数式编程。


Java

祝你在用Java编写函数代码时好运。不仅你的程序中有一半由静态关键字组成;大多数其他Java开发人员也会称您的程序为耻辱。这并不是说Java不好。但它不适用于函数式编程最好的解决问题,比如数据库管理或机器学习应用程序。


Scala

这是一个有趣的例子:Scala的目标是统一面向对象和函数式编程。如果您发现这种情况很奇怪,那么您并不孤单:函数式编程的目标是完全消除副作用,而面向对象编程则试图将它们保留在对象中。也就是说,许多开发人员认为Scala是一种帮助他们从面向对象编程过渡到函数式编程的语言。这可能使它们在未来几年更容易完全发挥作用。


Python

Python积极鼓励函数式编程。你可以通过每个函数默认至少有一个输入self来看到这一点。这很像Python的禅宗:显式比隐式好!


Clojure

根据创建者的说法,Clojure具有80%的功能性。默认情况下,所有值都是不可变的,就像在函数式编程中需要它们一样。但是,您可以通过使用可变值包装器来绕过这些不可变值。当您打开这样的包装器时,您得到的东西又是不可变的。


Haskell

这是少数纯函数式和静态类型的语言之一。虽然这在开发过程中可能会耗费大量的时间,但是当您调试程序时,它会给您带来巨大的回报。它不像其他语言那样容易学习,但绝对值得投资!



大数据即将到来,它带来了一个朋友:函数式编程。
与面向对象编程相比,函数式编程仍然是一个小众现象。然而,如果Python和其他语言中包含的函数式编程原则有任何意义,那么函数式编程似乎正在获得吸引力。
这非常有意义:函数式编程非常适合大型数据库、并行编程和机器学习。所有这些东西都在过去的十年里蓬勃发展。
虽然面向对象代码具有多个的优点,但功能代码的优点也不应被忽视。学习一些基本原则通常足以提升你作为开发者的游戏水平,并为未来做好准备。


回复暗号领取福利
为什么开发人员喜欢函数式编程?
扫描下方二维码,关注技福教育
发送关键字【报告】
即可领取最新行业报告合集哦~

为什么开发人员喜欢函数式编程?
为什么开发人员喜欢函数式编程?


为什么开发人员喜欢函数式编程?







来源:TNW
作者: RHEA MOUTAFIS
编辑/翻译:Lena Z
声明:本媒体部分图片、文章来源于网络,版权归原作者所有,不代表本公众号观点。如有侵权,请与我联系删除。

别忘了点赞+在看哦!

以上是关于为什么开发人员喜欢函数式编程?的主要内容,如果未能解决你的问题,请参考以下文章

前端必学——函数式编程

转载写给 C# 开发人员的函数式编程

写给 C# 开发人员的函数式编程

致开发人员:沉迷面向对象编程不可自拔?函数式编程了解一下

前端必学——函数式编程

电子书免费分享 -Java8函数式编程