Function Programming - 纯函数(Pure Function)

纯函数的定义,非常重要!!

Pure function 意指相同的输入,永远会得到相同的输出,而且没有任何显著的副作用。

老样子,我们还是从最简单的栗子开始:

var minimum = 21;
var OutercompareNumber = function(number) {
  return number > minimum;
}

以及

var InnercompareNumber = function(number) {
  var minimum = 21;
  return number > minimum;
}

  以上两个函数的区别大家都看到了,一个minimum定义在函数外面,一个在函数里面;那么我们调用这两个函数的结果就很有可能是不一样的;比如,我们在调用OutercompareNumber的时候,假设number这个参数我们始终传20,minimum不改变的情况下,结果为false;但一旦minimum改变成19,结果就为true,OutercompareNumber就不是pure的函数;而InnercompareNumber这个函数,如果始终传20,结果始终为false,那么我们就说InnercompareNumber为纯函数(pure function)。

总结来说,就是传的参数相同的情况下,永远会得到相同的输出。

那么我们说的显著的副作用又是什么呢?我们来看下定义:副作用是在计算结果的过程中,系统状态的一种改变,或是外部世界可观察的交互作用

比如,更改档案系统,发送http请求等,只要与function外部环境发生交互作用的都是副作用。

那么,如何避免这些副作用呢,继续来看栗子:

var callRequest = function(url, params) {
  return $.getJSON(url, params);
}

与

var delayCallRequest = function(url, params) {
  return function() {
    return $.getJSON(url, params);
  }
}

  callRequest直接返回了一个http请求,那么这个是与外界交互,返回的结果有太大的不确定性,所以是impure的函数;而delayCallRequest采用了延迟执行的方式,返回了一个函数,只有调用这个函数的时候才会发送请求:delayCallRequest(url, params)(),但就delayCallRequest而言,传相同的参数,得到的结果是一样的,是相同参数的函数,所以这个是一个pure的函数。

再看一个栗子,我们深入理解一下:

//impure
var signUp = function(attrs) {
  var user = saveUser(attrs);
  welcomeUser(user);
};

var saveUser = function(attrs) {
    var user = Db.save(attrs);
    ...
};

var welcomeUser = function(user) {
    Email(user, ...);
    ...
};

//pure
var signUp = function(Db, Email, attrs) {
  return function() {
    var user = saveUser(Db, attrs);
    welcomeUser(Email, user);
  };
};

var saveUser = function(Db, attrs) {
    ...
};

var welcomeUser = function(Email, user) {
    ...
};

  pure函数会自给自足,函数的依赖会特别明确,像impure的函数,Email做了什么我们并不知道,Db在背后做了什么,我们也无所得知,所以他们以参数的形式,保证输入相同的情况下,得到的结果一定是相同的,注意,这里也用了延迟执行的方式。

好啦,今天的纯函数就介绍到这里,我们下回再见~~早安!

时间: 2024-08-10 00:03:58

Function Programming - 纯函数(Pure Function)的相关文章

什么叫pure function(纯函数)

在Knockout中,用到了pureComputer(),其原理来自于纯函数(pure function).那么,什么叫纯函数呢? 纯函数 (来自:http://en.wikipedia.org/wiki/Pure_function) 在计算机编程中,假如满足下面这两个句子的约束,一个函数可能被描述为一个纯函数: 给出同样的参数值,该函数总是求出同样的结果.该函数结果值不依赖任何隐藏信息或程序执行处理可能改变的状态或在程序的两个不同的执行,也不能依赖来自I/O装置的任何外部的输入(通常是这样的-

纯函数和可观察副作用

当我第一次听到 “纯函数 (Pure Function)” 这个术语的时候我很疑惑.常规的函数做错了什么?为什么要变纯? 为什么我需要纯的函数? 除非你已经知道什么是纯函数,否则你可能会问同样的疑惑.不过这个概念其实很简单.我们可以花个 5 分钟一起来看以下. 什么函数是纯的? 纯函数的定义是: 如果函数的调用参数相同,则永远返回相同的结果.它不依赖于程序执行期间函数外部任何状态或数据的变化,必须只依赖于其输入参数. 该函数不会产生任何可观察的副作用,例如网络请求,输入和输出设备或数据突变(mu

闭包(Closure)和匿名函数(Anonymous function)/lambda表达式的区别

闭包(Closure)和匿名函数(Anonymous function)/lambda表达式的区别 函数最常见的形式是具名函数(named function): function foo(){ console.log("named function") } foo() 不过也可以将函数视作数据赋值给变量,这样的函数可以没有名字: nameless = function(){ console.log("anonymouse function") } nameless(

react事件绑定的三种常见方式以及解决Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state问题思路

在 React 组件中,每个方法的上下文都会指向该组件的实例,即自动绑定 this 为当前组件. 而且 React 还会对这种引用进行缓存,以达到 CPU 和内存的优化.在使用 ES6 classes 或者纯 函数时,这种自动绑定就不复存在了,我们需要手动实现 this 的绑定. 1.bind方法进行绑定,这个方法可以帮助我们绑定事件处理器内的 this ,并可以向事件处理器中传 递参数,如下图清晰明了: bind方法绑定 2.箭头函数进行绑定,箭头函数不仅是函数的“语法糖”,它还自动绑定了定义

Function Declaration(函数声明)和函数表达式的区别

前言 在ECMAScript中,有两个最常用的创建函数对象的方法,即使用函数表达式或者使用函数声明.对此,ECMAScript规范明确了一点,即是,即函数声明 必须始终带有一个标识符(Identifier),也就是我们所说的函数名,而函数表达式则可以省略.下面看看这两者的详细区别介绍. 什么是 Function Declaration(函数声明)? Function Declaration 可以定义命名的函数变量,而无需给变量赋值.Function Declaration 是一种独立的结构,不能

SQL 自定义函数(Function)——参数默认值

sql server 自定义函数分为三种类型:标量函数(Scalar Function).内嵌表值函数(Inline Function).多声明表值函数(Multi-Statement Function) 标量函数:标量函数是对单一值操作,返回单一值. 内嵌表值函数:内嵌表值函数的功能相当于一个参数化的视图.它返回的是一个表,内联表值型函数没有由BEGIN-END 语句括起来的函数体. 多声明表值函数:它的返回值是一个表,但它和标量型函数一样有一个用BEGIN-END 语句括起来的函数体,返回值

Python标准库:内置函数map(function, iterable, ...)

本函数是把函数对象function作为函数,iterable对象的每一项作为参数,然后进行计算后输出迭代子iterator.如果函数对象function可以输入多参数,那么后面可以跟多个可迭代的对象.多个迭代对象时,以最短的对象为运行结果的判断. 例子: #map() x = range(10) print(list(map(hex, x))) print(list(map(lambda y : y * 2 + 1, x))) print(list(map(lambda y, z : y * 2

js中(function(){…})()立即执行函数写法理解

javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解. ( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因并非如此.要理解立即执行函数,需要先理解一些函数的基本概念.

python之函数(function)

#今天来学习一下函数,function# 定义一个函数的时候,函数不会被执行,只有调用函数,函数才会执行## 定义函数# # 1.def是创建函数的关键字,创建函数# # 2.函数名# # 3.()# # 4.函数体# # 5.返回值### try:# 扑捉这段代码的执行# except:# 如果失败,则执行这里的语句## else:# 如果成功,则执行这里的语句## 执行函数## 函数名()## 类似这样定义一个函数### def 取快递():### xxxxx# xxxxx# xxxxx #