什么是副作用(Side Effect)
来源:互联网 发布:苹果mac如何卸载软件 编辑:程序博客网 时间:2024/05/16 15:52
副作用(Side Effect)是指函数或者表达式的行为依赖于外部世界。具体可参照Wiki上的定义,副作用是指
在2)中可以认为外部世界是相对于程序不确定的外部因素,如计算机实体(磁盘,内存条),用户输入行为等。
副作用是区别函数式编程语言和当今主流的面向对象/过程式编程语言的显著特征。在面向对象/过程式中变量(VARIABLE)是可以改变的量,一如代码实现。
哦,这是给变量一个值,如果我发现这个值不能满足我的需求还可以重新给它值。
赋值运算符提供了面向对象/过程式编程语言绝大部分的副作用。如果懂得这一点在面对函数式语言的"="的时候就不会惊恐,函数式之所以声称(几乎)无副作用就是因为它的"="有别于传统观念上的赋值行为,在函数式中"="是匹配(Match)运算符,对于没有进行绑定的变量第一次使用匹配运算符发生绑定行为,如erlang中
1)函数或者表达式修改了它的SCOPE之外的状态
2)函数或者表达式除了返回语句外还与外部世界或者它所调用的函数有明显的交互行为
int se(int * p){(*p)++;return *p;}
以及caller:
void foo(){int k = 1;int * p = &k;se(p);}几乎可以按照定义逐字匹配,se(int *)函数修改了域外(CALLER FUNCTION)的变量k的状态(++),所以se(int *)函数具有副作用
在2)中可以认为外部世界是相对于程序不确定的外部因素,如计算机实体(磁盘,内存条),用户输入行为等。
副作用是区别函数式编程语言和当今主流的面向对象/过程式编程语言的显著特征。在面向对象/过程式中变量(VARIABLE)是可以改变的量,一如代码实现。
int a = 1;a = 2;change(a,3);对于"="的行为我们都知道:
哦,这是给变量一个值,如果我发现这个值不能满足我的需求还可以重新给它值。
赋值运算符提供了面向对象/过程式编程语言绝大部分的副作用。如果懂得这一点在面对函数式语言的"="的时候就不会惊恐,函数式之所以声称(几乎)无副作用就是因为它的"="有别于传统观念上的赋值行为,在函数式中"="是匹配(Match)运算符,对于没有进行绑定的变量第一次使用匹配运算符发生绑定行为,如erlang中
X = atom. %okX = newAtom. %error可以看到当变量X第一次使用"="与atom绑定之后对其使用"="就会发生匹配行为而不是重新绑定,作为更强烈的论证可以看到
atom = X. %ok, match variable with atom
绑定后的X可以放到匹配运算符的左边。
匹配行为不与外部世界发生交互,它不会修改外部世界的任何状态,所以这也解释了函数式编程语言为什么几乎无副作用,不说"完全"是因为只要有IO就有副作用,没有IO的语言..我没见过.
正是因为(几乎)无副作用使得函数式编程语言在数学定义证明,并发处理等方面有天然的优势。
阅读全文
0 0
- 什么是副作用(Side Effect)
- 什么是clojure的副作用(side effect)
- sequence point顺序点,side effect副作用
- i++ : 顺序点(sequence point) 与 副作用 (side effect)
- i++ : 顺序点(sequence point) 与 副作用 (side effect)
- i++ : 顺序点(sequence point) 与 副作用 (side effect)
- i++ : 顺序点(sequence point) 与 副作用 (side effect)
- i++ : 顺序点(sequence point) 与 副作用 (side effect)
- side effect
- Side effect
- side effect
- side effect
- Side Effect
- i++ : 顺序点(sequence point) 与 副作用 (side effect)(转)
- 深入理解C语言-----副作用(Side Effect)和顺序点(Sequence Point)
- 什么是函数的副作用?
- 究竟什么是副作用
- Side Effect与Sequence Point
- CentOS 计划任务 及简单应用
- php判断是否为中文正则表达式大全
- 嵌入式软件工程师面试题
- 移动端滚动穿透的问题解决
- 关于正则表达式的一道面试题
- 什么是副作用(Side Effect)
- [A-frame文档学习笔记]HTML&Primitives
- 【HDU
- 关于Spring MVC的一个经验
- web基础知识回顾
- java代码混淆工具Jocky的介绍
- 【HDU-1234】 开门人与关门人
- How to Install TestLink on CentOS 7
- AtCoder GC 018A: Getting Difference 题解