have side nosideeffectss 这里side 什么意思类似于什么词

副作用(Side nosideeffects)是指函数或者表达式的行為依赖于外部世界具体可参照Wiki上的定义,副作用是指

1)函数或者表达式修改了它的SCOPE之外的状态

2)函数或者表达式除了返回语句外还与外部世堺或者它所调用的函数有明显的交互行为

对于1)而言考虑如下函数定义:

在2)中可以认为外部世界是相对于程序不确定的外部因素,如计算機实体(磁盘内存条),用户输入行为等

副作用是区别函数式编程语言和当今主流的面向对象/过程式编程语言的显著特征。在面向对象/过程式中变量(VARIABLE)是可以改变的量一如代码实现。

对于"="的行为我们都知道:

哦这是给变量一个值,如果我发现这个值不能满足我的需求还可以偅新给它值

赋值运算符提供了面向对象/过程式编程语言绝大部分的副作用。如果懂得这一点在面对函数式语言的"="的时候就不会惊恐函數式之所以声称(几乎)无副作用就是因为它的"="有别于传统观念上的赋值行为,在函数式中"="是匹配(Match)运算符对于没有进行绑定的变量第一次使鼡匹配运算符发生绑定行为,如erlang中

可以看到当变量X第一次使用"="与atom绑定之后对其使用"="就会发生匹配行为而不是重新绑定作为更强烈的论证鈳以看到

绑定后的X可以放到匹配运算符的左边。

匹配行为不与外部世界发生交互它不会修改外部世界的任何状态,所以这也解释了函数式编程语言为什么几乎无副作用不说"完全"是因为只要有IO就有副作用,没有IO的语言..我没见过.

正是因为(几乎)无副作用使得函数式编程语言在數学定义证明并发处理等方面有天然的优势。

side nosideeffectss 在维基百科上直接翻译为 "函数副莋用"

首先要明确“副作用”这个词没有贬义成分,不是“负面作用”而是“在满足主要功能(主作用?)的同时顺便完成了一些其怹的副要功能”。有个答主说“附作用”表示附加作用我觉得很好。

从数学的角度来讲作为一个函数,例如 f(x) = 2x这个函数,最重要的目嘚是什么就是对于传入的x值,找到它所对应的值在这个例子里就是 2乘以x。从编程的角度来说传入的x 就是一个函数的参数,而找到的對应的值就是函数的输出值,很多语言里用 return 这个关键字所以 y = f(2),得到了 y = 4这里y 被赋值了,很开心函数也完成了它最主要的作用:对每個自变量 x 计算出一个相对应的因变量 y。

从这个角度来说如果一个函数除了计算最终要返回的结果之外,还做了任何其他事情都可以成為“副作用”,因为这不是一个函数的首要功能至于这个“副作用”惊喜不惊喜,意外不意外与它是不是副作用的定义本身无关。

有些时候函数的副作用可能会比首要功能更重要。例如有 write() 这个函数把一些字符写到一个文件里,传回true/false表示是否写成功甚至不回传。这裏明显可以看出我们叫这个函数,主要还是希望它能把东西写到文件里的可惜从数学的角度来讲,函数的首要功能永远都是返回值所以这里“写文件”操作也被定义为“副作用”。

实际编程中我们不一定需要尽量避免副作用,但是一定要尽量避免“意外的”副作用比如我们可以通过合适的函数名或注释,提醒调用函数的人这个函数有副作用。

举个简单例子假如我们设计一个函数,从一个数组裏找出最大的数字两种写法:第一种,直接遍历数组找到最大的数字并返回结果,O(n) 代码略这个函数没有副作用,我们如果给它取名為 findMax() (找最大值)还算妥当第二种写法,对传入的数组进行从大到小排序之后返回数组的第一项,O(n log n) 代码略这个函数会把数组原先的顺序破坏,算是副作用(但不一定是坏事)不过如果我们依然给函数取名为 findMax() 的话,那别人发现自己的数组顺序被破坏了可能会凌乱为了提醒大家,比如我们可以给它取名为 sortArrayAndReturnMax() (排序并找最大值) 至少就比 findMax() (找最大值)更清晰些(举例而已,实际使用中最好还是拆成两个函數吧)

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

因为这样是只读的,要更改就报错了,想更改就要用get和set方法

发布了12 篇原创文章 · 获赞 3 · 访问量 2万+

我要回帖

更多关于 nosideeffects 的文章

 

随机推荐