文章目录
一.什么是函数
成为函数必须要满足一个条件:定义域内所有元素都必须在陪域内有且仅有一个对应元素。
1.1 逆函数(Inverse function)
- 一个函数未必会有逆函数
- 若函数f是一明确的逆函数,必须为双射函数
1.单射:陪域中每一元素只被f映射一次
2.满射:陪域中每一个元素都被f映射到
例如: f ( x ) = 2 x f(x)=2x f(x)=2x这个函数就没有逆函数,因为不是满射函数
1.2偏函数(Partial function)
定义:没有在定义域中定义所有元素但是满足其他需求(定义域里不存在任何在陪域里有多个元素与之相对应的元素)的关系一般称为偏函数。
现在我们看一个函数: y = x 2 y = \frac{x}{2} y=2x
如果我们假设这个函数的定义域和陪域都是N(包含0的正整数集)呢?
如果当x为奇数,比如,
3
2
\frac{3}{2}
23 不是一个整数, 不在陪域N内,所以这个函数没有在定义域中定义所有元素,他是一个偏函数
1.3复合函数(Compound function)
如果两个函数复合,f和g复合可标记为f。g(圆圈在中间不是在左下角),如果f(x)=x+2并且g(x)=x2,可得f。g=f(g(x))=f(x2)=(x*2)+2
注意⚠️:f。g与g。f 结果不同!
1.4多参函数(multi-parameter function)
f(x,y)=x+y就是一个多参函数,(x,y)是一个元组,比如(3,5),(2,4)……
f(3,5)=3+5;f(2,4)=2+4;
1.5函数柯里化(currying)
柯里化:是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
我们可以认为f(3,5)是一个从N到N的函数集的函数,所以f(x,y)=x+y就可以写成:
f
(
x
)
(
y
)
=
g
(
y
)
f(x)(y)=g(y)
f(x)(y)=g(y)其中
g
(
y
)
=
x
+
y
g(y)=x+y
g(y)=x+y在这种情况下,可以这样写
f
(
x
)
=
g
f(x)=g
f(x)=g他的意思是将函数f应用于参数x,结果是一个新的函数g。将函数g应用于y会得到:
g
(
y
)
=
x
+
y
g(y)=x+y
g(y)=x+y如果将其应用到(3,5),就会得到:
f
(
3
)
(
5
)
=
g
(
5
)
=
3
+
5
=
8
f(3)(5)=g(5)=3+5=8
f(3)(5)=g(5)=3+5=8
1.6偏应用函数
当一个函数有很多参数时,调用者就需要提供多个参数。如果减少参数个数,就可以简化调用者的负担。
- 比如我有一个函数计算两个数的乘积其中b是固定的数5,multi(a,b),需要传入两个参数才能计算。比如multi(2,5);multi(5,5);multi(6,5);假如我们需要传入10000组数进行计算,每次传入两个数不如‘让5为固定数,只传入a’这种方法更方便。
偏函数 vs 部分应用函数
(引用自 http://songkun.me/2018/05/16/scala-partialfunction-partially-applied-function-currying/)
虽然偏函数(partial function)、部分应用函数(partially applied
function)的英文名字非常接近,但它们却是风马牛不相及的两个概念:偏函数是仅能处理入参类型 子集 的函数,是数学概念; 部分应用函数是函数调用的结果,只不过该函数调用只提供了 部分参数;
部分应用函数 vs 柯里化
与前面一组不同,该两者并非由于名字接近而容易被混淆,部分应用函数和柯里化都可以用于 减少函数参数,但两者依然存在明显区别:
部分应用函数:应用已提供的参数,返回 一个 新函数,该函数接受剩余参数为参数; 柯里化:分解函数,将多参函数分解为 一系列 的单参函数;