纯函数、透明引用、副作用的含义

Side Effects(副作用)

According to Wikipedia, a function is said to have a side effect “if, in addition to returning a value, it also modifies some state or has an observable interaction with calling functions or the outside world.”

Side effects include things like:

? Writing or printing output.

? Reading input.

? Mutating the state of a variable that was given as input, changing data in a data structure, or modifying the value of a field in an object.

? Throwing an exception, or stopping the application when an error occurs.

? Calling other functions that have side effects.

referential transparency(透明引用)

An expression is referentially transparent (RT) if it can be replaced by its resulting value without changing the behavior of the program. This must be true regardless of where the expression is used in the program.

For instance, assume that x and y are immutable variables within some scope of an

application, and within that scope they’re used to form this expression:

x + y

You can assign this expression to a third variable, like this:

val z = x + y

Now, throughout the given scope of your program, anywhere the expression x + y is used, it can be replaced by z without affecting the result of the program

Pure functions(纯函数)

纯函数定义

Wikipedia defines a pure function as follows:

1. The function always evaluates to the same result value given the same argument value(s). It cannot depend on any hidden state or value, and it cannot depend on any I/O.

2. Evaluation of the result does not cause any semantically observable side effect or output, such as mutation of mutable objects or output to I/O devices.

“A function f is pure if the expression f(x)  is referentially transparent for all referentially transparent values x.”

To summarize, a pure function is referentially transparent and has no side effects

“A telltale sign of a function with side effects is that its result type is Unit.”

From these definitions, we can make these statements about pure functions:

? A pure function is given one or more input parameters.

? Its result is based solely off of those parameters and its algorithm. The algorithm will not be based on any hidden state in the class or object it‘s contained in.

? It won‘t mutate the parameters it’s given.

? It won‘t mutate the state of its class or object.

? It doesn‘t perform any I/O operations, such as reading from disk, writing to disk, prompting for input, or reading input.

纯函数的例子

These are some examples of pure functions:

? Mathematical functions, such as addition, subtraction, multiplication.

? Methods like split and length on the String class.

? The to* methods on the String class (toInt, toDouble, etc.)

? Methods on immutable collections, including map, drop, take, filter, etc.

? The functions that extract values from an HTML string in Recipe 20.3.

不是纯函数的例子

The following functions are not pure functions:

? Methods like getDayOfWeek, getHour, or getMinute. They return a different valuedepending on when they are called.

? A getRandomNumber function.

? A function that reads user input or prints output.

? A function that writes to an external data store, or reads from a data store.

时间: 2024-10-02 19:48:42

纯函数、透明引用、副作用的含义的相关文章

什么是函数式编程(副作用、纯函数、引用透明)

副作用的概念:一个带有副作用的函数不仅只是简单的返回一个值,还干了一些其他的事情,比如: 修改一个变量 直接修改数据结构 设置一个对象的成员 抛出一个异常或以一个错误终止 打印到终端或读取用户的输入 读取或写入一个文件 在屏幕上绘画 因此我们对于函数式程序的判定边界就在于:函数的副作用. 于是--当函数没有副作用,那么我们就说这个函数符合函数式编程(FP):再给出纯函数这个概念用来定义一个函数没有副作用,我们可以说纯函数构成的程序风格就是函数式的! buyCoffee的例子(p3):函数只不过是

函数式编程(一):纯函数

其他:函数式编程(二):curry 什么是纯函数? 纯函数是这样一种函数,即相同的输出,永远会得到相同的输出,而且没有任何可观察的副作用.‘副作用’是在计算结果的过程中,系统状态的一种变化,或者与外部世界进行可观察的交互.概括来讲,只要跟函数外部环境发生的交互就都是副作用.函数式编程的哲学就是假定副作用是造成不正当行为的主要原因.并不是说,要禁止使用一切副作用,而是,要让他们在可控的范围内发生.从定义上来说,纯函数必须能根据相同的输入返回相同的输出:如果函数需要跟外部事物打交道,那么就无法保证这

js函数式编程(1)-纯函数

我将写的第一个主题是js的函数式编程,这一系列都是mostly adequate guide这本书的读书总结.原书在gitbook上,有中文版.由于原作者性格活泼,书中夹杂很多俚语,并且行文洒脱.中文译版难免有时需要思量一番,既然读了就写出来,能方便别人最好,也请读者指正.正文如下. 如果一个函数是纯函数,那么其不依赖外部环境,并且不产生副作用. 1.不依赖外部环境,反例如下: const a1 = 10; const aFunc1 = () => { // 依赖外部变量 return a1;

函数的副作用 —— 纯函数的理解

函数副作用指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响.例如修改全局变量(函数外的变量)或修改参数. 纯函数 纯函数(Pure Function)——输入输出数据流全是显式(Explicit)的. 显式的意思是,函数与外界交换数据只有一个唯一渠道——参数和返回值:函数从函数外部接受的所有输入信息都通过参数传递到该函数内部:函数输出到函数外部的所有信息都通过返回值传递到该函数外部. 非纯函数 如果一个函数通过隐式(Implicit)方式,从外界获取数据,或者向外部输出数据,那么

纯函数和可观察副作用

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

[二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type used to indicate that an interface * type declaration is intended to be a <i>functional interface</i> as * defined by the Java Language Specificat

C#中的函数式编程:递归与纯函数(二)

在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential transparency)来定义的.如果一个表达式满足将它替换成它的值,而程序的行为不变,则称这个表达式是引用透明的. 现在,我们不妨进行一个尝试:我们来实现一些函数,但是这次有一个限制:只能用无副作用的表达式. 先以素数判定为例子,我们要写一个函数bool IsPrime(int n),它返回这个整数是不是素数.简单起见,我们采用最朴素的方

什么叫pure function(纯函数)

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

C++关键字、命名空间、函数重载、缺省参数、内联函数、引用

一 .C++入门 1.C++关键字 2.命名空间 3.C++输入&输出 4.缺省参数 5.函数重载 6.引用 7.内联函数 8.auto关键字 9.基于范围的for循环 10.指针空值nullptr&nullptr_t 二. 正文 1.C++关键字(C++98) C++98中的关键字总共用63个,如下表: 在这这做简单介绍,感兴趣的朋友可以参考相关资料作进一步了解. 2.命名空间 由于在编写程序的过程中,很容易出现变量.函数和类重名的现象,这些变量.函数和类都在全局作用域中,因此会导致很多