函数式编程
- 函数是一等公民,函数式的思想来源于数学运算,而柯里化的操作可以将多参函数转为单参函数,而单参函数一般希望是纯函数(即不存在副作用的函数),可以实现f(g(x))这样的合并操作的函数(通过队对外接口map方法实现变形),函数式的核心思想是基于函数或者说函子进行计算。
- 函子(即容器,一般拥有基本数据和map接口),函数式一般规定使用of来替换
new
操作
Maybe函子:可以对空值等问题进行检测:
class Maybe extends Functor {
map(f) {
return this.val ? Maybe.of(f(this.val)) : Maybe.of(null);
}
}
Either函子:替换if...else
,可以用于提供默认值,还有替换掉try...catch
.
class Either extends Functor {
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);
}
}
Either.of = function (left, right) {
return new Either(left, right);
};
ap函子:部署了ap方法的函子,当想要基于另一个函子内部的值进行计算时使用,相当于可以进行链式调用。
class Ap extends Functor {
ap(F) {
return Ap.of(this.val(F.val));
}
}
Monad函子:拥有一个flatMap方法,总是返回一个单层的函子,意思是把嵌套的函子铺平。
//这里应该才两层嵌套
class Monad extends Functor {
join() {
return this.val;
}
flatMap(f) {
return this.map(f).join();
}
}
//函数式在IO操作中的应用(将不纯的函数保装成纯函数来实现):
var tail = function(x) {
return new IO(function() {
return x[x.length - 1];
});
}
readFile('./user.txt')
.flatMap(tail)
.flatMap(print)
// 等同于
readFile('./user.txt')
.chain(tail)
.chain(print)
标签:right,return,函数,编程,Either,函子,left
From: https://www.cnblogs.com/mengyiqwq/p/16905532.html