函数式编程的无状态怎样理解

以下纯属个人理解,如有雷同,那就雷同吧!首先得先确定我们的讨论的状态是什么有状态是指:我可以把我的眉毛摘下来,( ??ω?)ノ??摘下,( ??ω??)安上, ( ??ω?)ノ??摘下,( ??ω??)安上,╰??( ?ω?)ノ??两边都摘下, ( ??ω??)安上。。无状态是指:( ??ω??)卧槽,摘不下来--------------------卖萌结束,回到正常,一般所说的状态可视为\u0026lt;reference, store, value\u0026gt; 这样的三元组(引用,存储, 值),reference也可以叫index或pointer或location,store则可看做是一个接受一个reference返回value的函数(具体实现可以是内存单元,或外部文件等),value就是存储的值了;状态变化则是指两方面了1.reference的改变,2.reference所指的value改变,一般情况下指后者(将名称绑定机制和赋值机制分开,如Java等语言);为什么要有上面的状态?这和为毛往数据库里插数据是一样的:共享状态,它是一个程序不同部分之间的“隐式通信通道”那函数式编程的无状态就是指,以上两者都是不可变的,那么上面的三元组也可以不需要了,也就是变量名称绑定和赋值是一起的,你不能搞一个a 是 undefine。为什么?根源如此。稍微了解一点历史和lambda calculi就知道,lambda 演算中项只能做规约和代换,或者说数学上就是如此,求解一个复杂表达式如 y = 到最后得到:y = 2x,那么y就是一个Nat -\u0026gt; Nat的函数,如果得到y = 2,那么y就是2,很自然,是不是?无状态,是不是?无状态/不共享状态的好处是啥?网上宣传的太多了,什么一个函数同样的参数不管调用多少次都会是返回一样的结果(测试与调试),并行计算(这里尤其多),推理优化等。。。那么无状态真的大丈夫?当然不是,所以才会有CPS,Monad等东西出来,要么通过膜法去模拟有状态,要么就直接上(如:Scala的var关键字)----------------------“副作用” 和上面所说的状态不是一个东西,状态的改变可视为副作用,它是一种“计算效应”
■网友
1.进去的一样……出来的必定一样-2.进去过的东西不因进去过而改变
■网友
对一个函数用同样参数的调用,在任何时候返回的结果都是一样的当然,这这方式是不能解决所有问题的,所以一般也要引入别的技巧来处理I/O、随机数等等


    推荐阅读