Either 函子

class Either {
  constructor(left, right) {
    this.left = left;
    this.right = right;
  }
  map(f) {
    return this.right ?
      Either.of(this.left, f(this.right)) :
      Either.of(f(this.left), this.right);
  }
  static of (left, right) {
    return new Either(left, right);
  };
}
var addOne = function (x) {
  return x + 1;
};
Either.of(5, 6).map(addOne);
// Either(5, 7);
Either.of(1, null).map(addOne);
// Either(2, null);

上面代码中,如果右值有值,就使用右值,否则使用左值。通过这种方式,Either 函子表达了条件运算。

提供默认值

Either 函子的常见用途是提供默认值。下面是一个例子。

let currentUser = {
  address: null
}
Either.of('昆明', currentUser.address).map(console.log); // 昆明
currentUser.address = '北京'
Either.of('昆明', currentUser.address).map(console.log); // 北京

上面代码中,如果用户没有提供地址,Either 函子就会使用左值的默认地址。

错误处理

Either 函子的另一个用途是代替 try...catch,使用左值表示错误。

function parseJSON(json, err) {
  try {
    return Either.of(null, JSON.parse(json));
  } catch (e) {
    return Either.of(err, null);
  }
}
console.log(parseJSON('{"a": 1}', '解析失败')); // Either { left: null, right: { a: 1 } }
console.log(parseJSON({"a": 1}, '解析失败')); // Either { left: '解析失败', right: null }

上面代码中,左值为空,就表示没有出错,否则左值会包含一个错误对象e。一般来说,所有可能出错的运算,都可以返回一个 Either 函子。

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress