2023年6月29日发(作者:)
复合函数、λ表达式以及⾼阶函数本⽂主要描述复合函数、λ表达式、⾼阶函数的⼀些基本概念以及它们之间的⼀些关系。⽰例代码将以Python作为主要编成语⾔。
⾸先简单地谈谈什么是函数。对于基本的⾯向过程以及函数式编程语⾔⽽⾔,可以直接⽤集合论中的函数概念加以描述。如果是⾯向对象的话,但使⽤朴素集合论中的函数概念去描述还显得不够,基本上要⽤到范畴(Category)论中的态射(Morphism)进⾏描述。⽽对于函数式编成语⾔⽽⾔,通过集合论的函数概念进⾏描述就显得更为适宜。
⾸先简单地介绍⼀下什么是函数。函数⾸先是⼀种关系。为了⽅便描述,后⾯将主要针对⼆元关系进⾏讲解,即可理解为⼀个输⼊,⼀个输出。函数定义:设A和B是两个任意集合,f是从A到B的⼆元关系。若f具有性质:(1)f的定义域Dom f = A,(2)如果有(a1, b1), (a1, b2)属于f,那么b = b2, (注:a1属于集合A,b1、b2属于集合B)则称关系f是从A到B的函数,记为f:A->B。
根据函数基本定义,我们下⾯可以举两个基本函数的例⼦:def sum(x): return x + x
def mul(x): return x * x在上述代码中,sum和mul都是函数。sum: Z->Z, mul: Z->Z,其中,Z为整数集。也就是参数x为整数,⽽返回值亦是整数。
有了函数的⼀个基本定义,那么后⾯我们可以容易地引⼊复合函数这⼀概念:设g: A->B, f: B->C,定义复合函数f○g为:f○g={(a, c)| a属于A, c属于C,且存在b属于B,使b=g(a),c=f(b)},称f○g是从A到C的复合函数,记为f○g: A->C。对a属于A,有(f○g)(a) = f(g(a))。
根据定义描述,我们下⾯将举⼀个复合函数的例⼦。def compFunc(x): return mul(sum(x))上述代码中,compFunc在表现形式上可看作为:mul○sum。尽管mul和sum的输⼊和输出都是整数,不过为了⽅便描述,我们假定sum: A->B,mul: C->D,由于这⾥集合B是集合C的⼦集(各位可以思考⼀下如果假定集合C是集合B的⼦集是否可以),所以关系compFunc仍可构成函数关系。compFunc: A->D。⾸先,A通过sum函数映射到B,然后B通过mul函数再映射到D,所以compFunc可表现为:mul(sum(a)),a为集合A的⼀个元素。
OK,有了基础概念之后我们就可以看看lambda表达式了。在函数式编成语⾔中,λ实际上就是指⼀个函数。不过它的⼀个特点就是,对于⼀个lambda⽽⾔,它所对应的是⼀个函数集中的某⼀个元素。我们看看下⾯⼀个简单的例⼦:def lambdaFunc(n): return lambda x: x +
n上述代码中,lambdaFunc的函数关系可被表达为:lambdaFunc: A->F,A是整数集,F是⼀个函数集。集合F的元素这⾥可记为:{λ1,val = lambdaFunc(10)λ2, ...}。其中,元素的下标为labmdaFunc的输⼊。(20)由于对于lambdaFunc中的lambda⽽⾔,这个lambda受到lambdaFunc输⼊参数n的制约。因此对于不同的输⼊n就会映射到F集中不同的lambda元素。⽽对于某⼀个函数lambdaε(ε为下标),lambdaε: B->C。lambda的输⼊参数x属于集合B,⽽其返回值则属于集合C。因此对于整个表达式lambdaFunc(10)(20)⽽⾔,就是(10属于A)通过lambdaFunc映射到(lambda(10)属于F);再由(20属于B)通过lambda(10)最后映射到(30属于C)。因此val的值就是30。如果将lambdaFunc(10)抽象掉的话,即aFunc = lambda(10)val = aFunc(20)
那么aFunc实际上就可以视为⼀个复合函数:def aFunc(n): def lam(x): return x + n这⾥,我们可以将lam(10)中的“10”视为:B->B这样的形式。
return lam(10)
下⾯将描述⾼阶函数。在《程序设计语⾔——实践之路》第⼆版汉化版中的第545页中讲述了⾼阶函数的概念:如果⼀个函数以函数作为实在参数,或者返回函数作为值,那么它就是⼀个⾼阶函数(high-order function),也称为函数形式。下⾯的例⼦描述了⼀个⽐较简单的⾼阶函数:def
HighOrderFunction():
return lambda f, g:
lambda x: g(f(x))我们来看⼀下HighOrderFunction:val =
HighOrderFunction: Ο->F,其中Ο表⽰空集,F为函数集lambda(f, g)。我们这⾥看到lambda(f, g)有两个输⼊参数,为了⽅便描述,我HighOrderFunction()们将(f, g)作为⼀个关系对⽽看成⼀个输⼊源。设R为⼀个函数关系对集,(f, g)为其中⼀个元素,那么有lambda(f, g): R->G。设G为⼀个函(sum, mul)(10)数集,lambda(x)是其中⼀个元素。lambda(x): A->C。我们可以看到⾼阶函数实际上隐藏了两个或两个以上的lambda。
下⾯给出完整的⽰例:def sum(x): return x + x
def mul(x): return x * x
def
HighOrderFunction(): return lambda f, g:
lambda x: g(f(x))
def lambdaFunc(n): return lambda x: x +
n
def compFunc(x): return mul(sum(x))
def aFunc(n): def lam(x): return x + n
发布者:admin,转转请注明出处:http://www.yc00.com/news/1687976039a62683.html
评论列表(0条)