Javascript 仿射(松弛线性)类型的思想是否可以在非类型化设置中实现以实现安全突变?

Javascript 仿射(松弛线性)类型的思想是否可以在非类型化设置中实现以实现安全突变?,javascript,functional-programming,mutation,linear-types,Javascript,Functional Programming,Mutation,Linear Types,如果我能时不时地在Arrays和Maps上使用安全的就地破坏性更新,这将非常有用。线性类型是一种允许安全突变的技术,它将值的使用限制为一次语义。虽然在Javascript中似乎不可能只实现一次,但下面是放松的至多一次变体的实现,它对应于仿射类型: class LinearProxy{ 构造函数(){ 这一次=假; } 得到(好的){ 如果(这一次) 抛出新类型错误(“非线性类型使用”); 否则,这一次=真; 如果(k==“运行”) 返回一次(f=>{ 常数r=f(o); 如果(r==o) 抛出

如果我能时不时地在
Array
s和
Map
s上使用安全的就地破坏性更新,这将非常有用。线性类型是一种允许安全突变的技术,它将值的使用限制为一次语义。虽然在Javascript中似乎不可能只实现一次,但下面是放松的至多一次变体的实现,它对应于仿射类型:

class LinearProxy{
构造函数(){
这一次=假;
}
得到(好的){
如果(这一次)
抛出新类型错误(“非线性类型使用”);
否则,这一次=真;
如果(k==“运行”)
返回一次(f=>{
常数r=f(o);
如果(r==o)
抛出新类型错误(“非线性类型使用”);
否则返回r;
});
返回o[k];
}
设置(o、k、v){
如果(这一次)
抛出新类型错误(“非线性类型使用”);
o[k]=v;
返回true;
}
}
constlinear=o=>newproxy(o,newlinearproxy());
const once=f=>{
let called=假;
返回x=>{
如果(呼叫)
抛出新类型错误(“非线性类型使用”);
否则{
调用=真;
返回f(x);
}
};
};
const run=f=>tx=>
tx[“运行”](f);
常数id=x=>x;
const last=xs=>xs[xs.length-1];
常量dup=xs=>[…xs,…xs];
常数xs=线性([1,2,3]),
ys=线性([1,2,3]),
zs=线性([1,2,3]);
xs[3]=4;
xs[4]=5;
console.log(
“运行(最后一次)(xs):”,
运行(最后一次)(xs));//5.
试试{run(last)(xs)}
catch(e){console.log(“run(last)(xs):”,e.message)}//类型错误(A)
试试{const x=xs[4]}
catch(e){console.log(“x=xs[4]:”,e.message)}//类型错误(A)
尝试{xs[0]=11}
catch(e){console.log(“xs[0]=11:,e.message)}//类型错误(B)
试试{run(id)(ys)}
catch(e){console.log(“run(id)(ys):”,e.message)}//类型错误(C)
console.log(run(dup)(zs));//[1,2,3,1,2,3](D)