抛去复杂的数学理论,直观的理解为,函数也是一个对象,也能像在该语言中的其他的基本数据类型一样被我们耍玩(即赋值、作为参数等)。
更具体地:
In mathematics and computer science, higher-order functions or functionals are functions which do at least one of the following:
它们的关系或许可以跟数学逻辑里面的几个层次进行一下类比。
propositional logic是最基本的,只由变量和与或非构成。(原谅我的不严格定义)
在first order logic中,全称量词(for all)和存在量词(there exist)出现了,却只能作用在变量上面。(普通非函数式语言,只有一阶函数)
而二阶逻辑却甚至能把这些东西应用到谓词上面!(函数式语言)
因此,以上,二阶及其以上的逻辑被成为高阶的。
在scheme中,我们可以这样玩:
(define combine-op
(lambda (a b x)
(a (b x))))
(define (add10 x) (+ x 10))
(define (mul5 x) (* x 5))
(combine-op mul5 add10 -2)
第一个define,定义了一个这样的函数:它有三个变量,前两个是两个函数,后一个是一个操作数。
作用是,应用b到x在应用a到b(x),即a(b(x))
然后定义了两个函数,分别是x+10和x*5
最后我们使用第一个定义的函数,用第二、三个函数以及-2作为参数,得到我们要的结算结果。
联想一下c/c++,或许我们可以马上想到,这有啥?可以用函数指针来做嘛。
然而函数指针传递的只是简单的,在编译时确定好函数的地址。而fp里面却可以运行时动态地生成函数并进行传递(比如lambda,匿名函数)!
比如我们定义一个函数func,它接受一个函数f作为参数,然后返回一个函数g。
f与g都接受两个参数。而g(x,y)=f(x,y)+5
当然,使用函数指针,还是可以写出具有高阶函数风格的代码滴。
更具体地:
In mathematics and computer science, higher-order functions or functionals are functions which do at least one of the following:
- take one or more functions as an input
- output a function.
它们的关系或许可以跟数学逻辑里面的几个层次进行一下类比。
propositional logic是最基本的,只由变量和与或非构成。(原谅我的不严格定义)
在first order logic中,全称量词(for all)和存在量词(there exist)出现了,却只能作用在变量上面。(普通非函数式语言,只有一阶函数)
而二阶逻辑却甚至能把这些东西应用到谓词上面!(函数式语言)
因此,以上,二阶及其以上的逻辑被成为高阶的。
在scheme中,我们可以这样玩:
(define combine-op
(lambda (a b x)
(a (b x))))
(define (add10 x) (+ x 10))
(define (mul5 x) (* x 5))
(combine-op mul5 add10 -2)
第一个define,定义了一个这样的函数:它有三个变量,前两个是两个函数,后一个是一个操作数。
作用是,应用b到x在应用a到b(x),即a(b(x))
然后定义了两个函数,分别是x+10和x*5
最后我们使用第一个定义的函数,用第二、三个函数以及-2作为参数,得到我们要的结算结果。
联想一下c/c++,或许我们可以马上想到,这有啥?可以用函数指针来做嘛。
然而函数指针传递的只是简单的,在编译时确定好函数的地址。而fp里面却可以运行时动态地生成函数并进行传递(比如lambda,匿名函数)!
比如我们定义一个函数func,它接受一个函数f作为参数,然后返回一个函数g。
f与g都接受两个参数。而g(x,y)=f(x,y)+5
当然,使用函数指针,还是可以写出具有高阶函数风格的代码滴。
No comments:
Post a Comment