IO用来将不纯的函数变为纯的,它采取的方式呢,真的是不大高明甚至是有些粗暴的,就是“不调用”。也就是将函数视为“数据”。直到你扣动扳机的那一刻(调用runIo方法),函数才被执行。例:
const R= require('ramda');
const {IO} = require('ramda-fantasy');
//一个要操作外部全局变量的非纯函数
var globalVar = 'Hello';
const writeGlobleVar = (v)=> globalVar += v;
//其他的一些纯函数
const Fn1 = (v)=> R.toUpper(v);
const Fn2 = (v)=> '_' + v;
const Fn3 = (v)=> v + '_welcome'
//组合我们的调用
const processStr = R.pipe(Fn1,Fn2,Fn3,writeGlobleVar);
processStr('kugou');
console.log(globleVar);
组合得到的processStr方法直接写了外部变量,是不纯的。我们用IO来搞一个纯的
const processStr = IO(Fn1).map(Fn2).map(Fn3).map(writeGlobleVar);//方法链被包裹在了IO对象中
processStr.runIO('kugou');//程序员自己扣动板机,并承担自己犯下的罪行
console.log(globalVar);
那么问题来了,这有个毛用啊?在js的地盘上,不纯太正常了,我也想不出这玩意有啥用,如果我将来我有幸能碰到使用这玩意的地方,我会来补充示例的。下面想讲一下Identity。