美文网首页
初识函数式编程(一)

初识函数式编程(一)

作者: 拳战攻城师 | 来源:发表于2021-03-15 01:28 被阅读0次

一、纯函数

特点:

  • 对于相同的输入,永远会得到相同的输出。
  • 没有任何可观察的副作用
  • 不依赖外部环境的状态
    例子:
//Array.slice是纯函数,Array.splice不是纯函数,存在副作用
var  arr = [1,2,3,4,5];
arr.slice(0,3);
arr.splice(0,3);

优点:

  • 降低系统复杂性
  • 可缓存
var min = 18;
//checkAge不是纯函数,因为其依赖外部变量min。
var checkAge1 = age=> age>min;

//虽然checkAge2是纯函数,但缺乏扩展性
var checkAge2 = age=>age>18;

二、函数柯理化

特点:传递函数的一部分参数来调用,返回一个函数去处理剩下的参数。
例子一:改写刚才的checkAge函数,使其具备可扩展性

var checkAge = min=>(age=>age>min);

//通过传入参数18,将min变量固定下来,提高扩展性。
var checkAge18 = checkAge(18);

//纯函数,刚刚的!
checkAge18(20);  //true;

例子二:函数柯理化过程

//柯理化之前
function add(x,y){
  return x+y;
}
//柯理化之后
function addX(y){
  return function(x){
    return x+y;
  }
}
addX(2)(1);  //3

例子三:通过函数柯理化来“缓存”参数

function test(p1,p2){
  this.val = p1+p2;
}
var bar = test.bind(null,"p1");
var baz = new bar("p2");
console.log(baz.val);  //p1p2

优点:

  • “预加载”函数的方法
  • 避免纯函数的硬编码,提高可扩展性
  • 降低纯函数对外部变量的依赖

三、函数组合
特点:有效解决函数嵌套的问题h(g(f(x)))

const compose = (f,g)=>( x=>f(g(x)));
var first = arr=>arr[0];
var reverse = arr=>arr.reverse();
var last = compose(first,reverse);
last([0,1,2,3,4,5]);  //5

四、Point Free
把对象自带的方法转换成纯函数,不要命名中间转瞬即逝的变量。
Bad Case:

const f = str=>str.toUpperCase().split(' ');

Good Case:

const compose = (f,g)=>( x=>f(g(x)));
var toUpperCase = word=> word.toUpperCase();
var split = x=>(str=>str.split(x));
var f = compose(split(' '), toUpperCase);
f('abcd efgh');  //['ABCD','EFGH']

优点:减少不必要的命名,让代码保持简洁、通用

五、声明式与命令式代码

//命令式
var CEOs = [];
for( var i=0; i<companies.length; ++i ){
  CEOs.push(compaines[i].CEO);
}
//声明式
let CEOs = companies.map(c=>c.CEO);

优点:

  • 专注于编写业务代码,不需要考虑内部实现。
  • 优化代码时,只需要集中目光在函数内部即可。

六、惰性求值


相关文章

  • 函数式编程

    函数式编程初识 一.简介 他是和面向对象编程平起平坐的一种编程范式。 函数式编程就是一种抽象程度很高的编程范式,纯...

  • 初识函数式编程(一)

    一、纯函数 特点: 对于相同的输入,永远会得到相同的输出。 没有任何可观察的副作用 不依赖外部环境的状态例子: 优...

  • 初识函数式编程

    命令式编程 对于函数式编程,是早有耳闻,但是一直没有去了解过,正好最近有时间,就花一晚上了解了下。 要说函数式编程...

  • 函数式编程【1】——初识函数式编程

    1.一段话理解函数式编程 首先说一下函数和方法的区别,简单的可以理解为同一个东西,都是一个执行块。前者是面向过程的...

  • RxSwift初探(1)

    一、前提:函数响应式编程思想 简单来说 函数响应式编程 = 函数式编程 + 响应式编程 (1)函数式 函数式编程是...

  • iOS 函数编程 & 链式编程

    函数式(链式)编程 函数式编程概念 函数式编程是种编程范式 函数式编程 Functional Programmin...

  • RxSwift-初探

    函数响应式编程 一:函数式 函数式编程简称FP(Functional Programming),函数式编程就是一种...

  • iOS-ReactiveCocoa使用之RACCommand

    前言 前几天开始研究Cocoa的第三方编程框架ReactiveCocoa,其使用响应式、函数式的编程思想,对于初识...

  • Python中的函数式编程

    函数式编程 说到函数式编程,我们的重点在于为什么要采用函数式编程,而不是什么是函数式编程。 函数式编程的优点:一、...

  • RxJava系列|RxJava简介(一)

    函数响应式编程 函数式编程是一种编程范式。 常见的编程范式有:命令式编程、函数式编程和逻辑式编程。 面向对象就是一...

网友评论

      本文标题:初识函数式编程(一)

      本文链接:https://www.haomeiwen.com/subject/qxrmqltx.html