Javascript 对不纯计算和懒散的描述能遏制副作用吗?

Javascript 对不纯计算和懒散的描述能遏制副作用吗?,javascript,functional-programming,lazy-evaluation,side-effects,purity,Javascript,Functional Programming,Lazy Evaluation,Side Effects,Purity,FP试图通过仅仅描述不纯计算并在以后运行它们来将程序的纯域与不纯域分开。我一直在想这是否意味着副作用的有害影响也被推迟了 Aff的类型通过将不纯数组计算包装成thunk来创建它们的描述。一次执行Aff计算的结果是共享的,即Aff具有惰性语义: //产品类型构造函数 常量记录=(类型,o)=> (o[type.name | | type]=type.name | | type,o); //Arr型 const Arr=thunk=>记录( Arr,{get run(){删除this.run;th

FP试图通过仅仅描述不纯计算并在以后运行它们来将程序的纯域与不纯域分开。我一直在想这是否意味着副作用的有害影响也被推迟了

Aff
的类型通过将不纯数组计算包装成thunk来创建它们的描述。一次执行
Aff
计算的结果是共享的,即
Aff
具有惰性语义:

//产品类型构造函数
常量记录=(类型,o)=>
(o[type.name | | type]=type.name | | type,o);
//Arr型
const Arr=thunk=>记录(
Arr,{get run(){删除this.run;this.run=thunk();返回this.run});
//函子
常数arrMap=f=>tx=>
Arr(()=>f(tx.run));
//实用的
常数arrAp=tf=>tx=>
Arr(()=>tf.run(tx.run));
常数arrOf=xs=>Arr(()=>xs);
//不纯函数
常量arrPush=x=>xs=>(xs.push(x),xs);
常量arrShift=xs=>(xs.shift(),xs);
常量arrGet=i=>xs=>xs[i];
常量arrAppend=xs=>ys=>
(xs.push.apply(xs,ys),xs);
//主要
常数ta=arrOf([1,1]);//[1,1]
常数tb=arrOf([2,2]);//[2,2]
常数tc=arrMap(arrPush(10))(ta);//[1,1,10]
常数td=arrMap(arrPush(20))(tb);//[2,2,20]
常数te=arrAp(
arrMap(arrAppend)(tc))(td);//[1,1,10,2,2,20]
常数tf=arrMap(arrShift)(te);//[1,10,2,2,20]
常数tg=arrMap(arrGet(1))(tf);//10
//^^A
常数th=arrMap(arrGet(4))(tf);//20
//^^A
常量main=arrAp(
arrMap(x=>y=>x+y)(tg))(th);
console.log(
main.run);//10+20