美文网首页
[underscore 源码学习] 函数式编程思想概述

[underscore 源码学习] 函数式编程思想概述

作者: 小黄人get徐先生 | 来源:发表于2020-01-26 17:08 被阅读0次
  • javascript 作为一种典型的多范式编程语言,这两年随着 React 的火热,函数式编程的概念也开始流行起来;
  • Rxjslodashunderscore 等多种开源库都使用了函数式的特性。

函数式的特征有哪些?

1. 纯函数

定义:对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环境的状态。

例子:数学公式 y = f(x);

JavaScript 中,对于数组的操作有些是纯的,有些是不纯的。

var arr = [1,2,3,4,5];
// 纯函数
arr.slice(0, 3); // => [1,2,3]
arr.slice(0, 3); // => [1,2,3]

// 非纯函数
arr.splice(0, 3); // => [1,2,3]
arr.splice(0, 3); // => [4,5]
函数式编程为何排斥不纯的函数?

非纯函数中,函数的行为需要外部的系统环境决定。也就是说此函数行为不仅取决于输入的参数 age,还取决于一个外部的变量 timeOfLife

这种对于外部状态的依赖,是造成系统复杂性大大提高的主要原因。

var timeOfLife = 20;

// 纯函数
function test(age) {
  return age > 20;
}

// 非纯函数
function test(age) {
  return age > timeOfLife;
}

2. 函数柯里化

定义:向函数传递一部分参数来调用它,让它返回一个函数去处理剩下的参数。

事实上函数柯里化是一种 “预加载” 函数的方法,通过传递较少的参数,得到一个已经记住了这些参数的新函数,某种意义上讲,这是一种对参数的 “缓存”,是一种非常高效的编写函数的方法。

var timeOfLife = 20;
function test(timeOfLife) {
  return function(age) {
    return age > timeOfLife;
  }
}
var testing = test(20);
testing(18); // => false

3. 函数组合

为避免写出不优雅的包菜式代码 h(g(f(x))) ,我们需要用到函数组合。

我们定义的 compose 就像是双面胶一样,可以把任何两个纯函数结合到一起,也可以扩展出组合 N 个函数的 N 面胶。

这种灵活的组合,让我们可以像拼积木一样优雅地组合函数式代码。

// 两个函数的组合
var compose = function(f, g) {
  return function(x) {
    return f(g(x));
  }
};
var mult = function(x) {
  return x*5;
}
var add = function(x) {
  return x+1;
}
compose(mult, add)(2); // => 15

4. 声明式与命令式

命令式代码:
通过编写一条又一条指令,让计算机执行一些动作,其中一般会涉及许多繁杂的细节。

声明式代码:
通过写表达式的方式,声明我们想干什么,而不是通过一步一步的指示。

声明式代码,是函数式编程的一个明显好处 --- 编写,优化代码时更加专注。

// 命令式
var rest = [];
var arr = [4,9,16,25,4,16];
for(var i = 0; i < arr.length; i++) {
  if (rest.indexOf(arr[i]) === -1) {
    rest.push(arr[i]);
  }
}

// 声明式
var rest = arr.map(Math.sqrt);

总结

  • 函数对于外部状态的依赖,是造成系统复杂性大大提高的主要原因。
  • 代码书写中让函数尽可能地纯净。
  • 函数式编程不是万能的,它与 OOP 一样,只是一种编程范式。
  • 为降低软件复杂度,OOP 的方式是靠良好的封装,继承,多态以及接口定义。函数式编程则靠纯函数以及它们的组合,柯里化等技术。

相关文章

  • [underscore 源码学习] 函数式编程思想概述

    javascript 作为一种典型的多范式编程语言,这两年随着 React 的火热,函数式编程的概念也开始流行起来...

  • 什么是函数式编程

    一、以函数式编程思想实现的库lambda、underscore? https://underscorejs.org...

  • underscore 源码分析[总纲]

    写作意图 起初,我分析 underscore 的源码只是想更深入的了解函数式编程(Functional Progr...

  • Scala程序设计—基础篇

    0 相关源码 1 函数式编程思想 1.1 介绍 1.2 scala函数式编程思想 2 环境搭建 Mac 安装 br...

  • Ramda.js 入门

    1、前言 Ramda.js 是函数式编程领域中类似 lodash、underscore 的存在。在函数式编程流行的...

  • JS进阶——underscore源码(1)

    目录 说明 underscore是一个很有用的javaScript工具库,对函数式编程提供很多方法,所以读源码很适...

  • Python函数式编程指南

    注:采转归档,自己学习查询使用 Python函数式编程指南(1):概述Python函数式编程指南(2):函数Pyt...

  • RxSwift开篇

    阅读 RxSwift 源码的目的 RxSwift采用面向协议编程思想,函数式编程,堪称教科书式编码,想要写好Swi...

  • RxSwift初探(1)

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

  • 函数响应式编程思想 & RxSwift 核心逻辑(一)

    函数响应式编程思想 函数响应式编程思想即是将函数式编程和响应式编程相结合。 函数式编程 顾名思义,就是像函数一样的...

网友评论

      本文标题:[underscore 源码学习] 函数式编程思想概述

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