函数式编程

函数式编程

  1. 函数是一等公民,函数式的思想来源于数学运算,而柯里化的操作可以将多参函数转为单参函数,而单参函数一般希望是纯函数(即不存在副作用的函数),可以实现f(g(x))这样的合并操作的函数(通过队对外接口map方法实现变形),函数式的核心思想是基于函数或者说函子进行计算。
  2. 函子(即容器,一般拥有基本数据和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)
posted @ 2022-11-19 10:03  梦呓qwq  阅读(25)  评论(0编辑  收藏  举报