我将写的第一个主题是js的函数式编程,这一系列都是mostly adequate guide这本书的读书总结。原书在gitbook上,有中文版。由于原作者性格活泼,书中夹杂很多俚语,并且行文洒脱。中文译版难免有时需要思量一番,既然读了就写出来,能方便别人最好,也请读者指正。正文如下。

如果一个函数是纯函数,那么其不依赖外部环境,并且不产生副作用。

  • 1.不依赖外部环境,反例如下:
const a1 = 10;
const aFunc1 = () => {
// 依赖外部变量
return a1;
}

依赖外部环境的函数在运行时必须满足环境条件,如上,aFunc1在a1创建之前运行,就出错了。

  • 2.不产生副作用。所谓副作用,是一切与外部交互的作用,比如console.log,IO,网络请求等。这些操作的结果是不可预计的,所以当包含副作用操作的函数执行后,结果是不可预计的。比如IO读写失败,网络出现问题,console.log通常没什么问题,但这仍然是外部的。举个片面的例子,在react里使用,就有可能因为打印某个在未来会被改变的状态,导致组件不必要的被刷新。

  • 3.函数与外部的合法交互只能通过参数传递的方式。

那么为什么要用纯函数,纯函数和函数式编程有什么关系?

函数式编程,本质上是数学,它是数学现有理论在编程上的实现,在数学上,一个定理成立通常要满足一些数学条件,函数式编程也需要满足条件,这个条件就是函数必须是纯函数。

那么这是什么数学理论呢?

如上图,可以用一个函数表达式描述,即y = f(x),这是一种一一对应关系,输入x能得到唯一的结果y。也就是说x经过f的转换变成y,这个过程是稳定的,确定的,以此类推,y也可以经过某种确定的转换g,变成z,那么就具有如下等式:

\[y = f(x) = 2x
\]

\[z = g(y) = y + 1
\]

\[z = g(f(x)) = w(x) = 2x + 1
\]

也就是说x经过w转换,可以变成z

某个状态经过多个函数转换成另一个状态,那么中间转换过程可以结合成一个转换,这大大的使问题简化,这是函数式编程带来的好处,而且只是一部分的好处,而这都基于纯函数。

### 如何看待副作用?

当然,我们知道,**很多时候无法避免使用副作用**。就如发送消息,必须经过网络。那是否函数式编程没有实际运用价值呢?当然不是。所有事情都不应该极端的理解,函数式编程的种种定理必须以纯函数作为根基,目的是写出健壮的,声明式的代码。可以利用函数式编程中如curry,functor,monad等奇巧淫记,将副作用加以限制并降到最低限度,保证代码的大部分是纯的。

js函数式编程(一)-纯函数的更多相关文章

  1. JavaScript函数式编程(纯函数、柯里化以及组合函数)

    JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 函数式编程(Functional Programming),又称为泛函编程,是一种编程范式.早在很久以前就提出了函数式编程这个概念了 ...

  2. 从函数式编程到Ramda函数库(一)

    函数式编程是种编程方式,它将电脑运算视为函数的计算.函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值).和指令式编程相比, ...

  3. JS函数式编程 - 概念

    最近在看Typescript,顺便看了一些函数式编程,然后半个国庆假期就没有了.做个笔记,分几个部分写吧. 最开始接触函数式编程的时候,第一个接触的概念就是高阶函数,和柯里化.咋一看,这不就是长期用来 ...

  4. 【Python】[函数式编程]高阶函数,返回函数,装饰器,偏函数

    函数式编程高阶函数 就是把函数作为参数的函数,这种抽象的编程方式就是函数式编程.--- - -跳过,不是很理解,汗 - ---

  5. 从函数式编程到Ramda函数库(二)

    Ramda 基本的数据结构都是原生 JavaScript 对象,我们常用的集合是 JavaScript 的数组.Ramda 还保留了许多其他原生 JavaScript 特性,例如,函数是具有属性的对象 ...

  6. Python之路(第七篇)Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

    一.作用域 return 可以返回任意值例子 def test1(): print("test1") def test(): print("test") ret ...

  7. 前端分享----JS异步编程+ES6箭头函数

    前端分享----JS异步编程+ES6箭头函数 ##概述Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只 ...

  8. python函数式编程之返回函数、匿名函数、装饰器、偏函数学习

    python函数式编程之返回函数 高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回. 函数作为返回值 def laxy_sum(*args): def sum(): ax = 0; fo ...

  9. Python之路Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

    Python之路Python作用域.匿名函数.函数式编程.map函数.filter函数.reduce函数 一.作用域 return 可以返回任意值例子 def test1(): print(" ...

随机推荐

  1. js函数-构成

    前言 函数是一种封装,在任何语言中都是一个核心概念.在js中,函数是做为对象的子类型存在的.可以拥有自己的属性和方法,可以做为值进行传递,这两个特性让js拥有使用函数式编程的能力. 函数的声明 字面量 ...

  2. java基础第六篇之常用思想、封装、继承和多态

    a.累加求和思想:求1~100的和,求数组/集合中元素的和,求偶数的数,求总分 int sum=0//循环外部定义sum变量,循环里面对每个元素累加 for (; ; ) { //sum+=数据 } ...

  3. C - Distinct Substrings (模板)

    https://vjudge.net/problem/SPOJ-DISUBSTR 有两种方式来求去除重读的子串 #include <bits/stdc++.h> using namespa ...

  4. 集合之ArrayList,HashSet,HashMap

    结合框架的体系结构: 一.List(列表) 1. List的特点 (1)List是元素有序并且可以重复的集合,称为序列 (2)List可以精确的控制每个元素的插入位置,或删除某个位置的元素 (3)Li ...

  5. Codeforces Round #564 (Div. 2) B. Nauuo and Chess

    链接:https://codeforces.com/contest/1173/problem/B 题意: Nauuo is a girl who loves playing chess. One da ...

  6. Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) B

    Arpa is taking a geometry exam. Here is the last problem of the exam. You are given three points a,  ...

  7. api接口测试工具和接口文档管理工具

    api接口测试工具和接口文档管理工具 1.postman(https://www.getpostman.com) Postman 是一个很强大的 API调试.Http请求的工具.她可是允许用户发送任何 ...

  8. 038 Count and Say 数数并说

    数数并说序列是一个整数序列,第二项起每一项的值为对前一项的计数,其前五项如下:1.     12.     113.     214.     12115.     1112211 被读作 " ...

  9. pom文件jar包缺失问题

    一般情况,不在中央仓库的jar包,比如自己的版本,要用的话打入maven私服 在eclipse中引入其他项目(包含jar包),类似于放入了私服,删除工程源文件,会导致别的工程引用此jar包失效

  10. mysql 取整

    在mysql中,当处理数值时,会用到数值处理函数,如有一个float型数值2.13,你想只要整数2,那就需要下面的函数floor与round.   floor:函数只返回整数部分,小数部分舍弃.    ...