高阶函数 Higher-order function
2015-07-20 20:34
309 查看
偶然看到一小段关于高阶函数的讨论。所以认真查了下。
其实关于这个名词,我相信很多人和我一样早就听说过。只是平时的工作几乎用大着,也就没太认真的思考过。
wiki英文版在此
看完后感觉还是挺简单的,不难理解。虽然wiki一如既往的啰嗦了一大堆,说得很学院。给出了很多编程语言的例子。bla bla bla~~
但其第一句就已经给出了定义。满足以下两个条件之一的函数。
关于现代众多的编程语言怎么支持高阶函数也就不多说了。说一下C语言的一个函数 stdlib qsort
这个函数写C的一定很熟悉。能够对任意类型的一块连续内存进行快速排序。原型如下:
前3个参数是描述输入的数组,1是地址,2是个元素个数,3是每个元素大小。最后是一个比较用的函数。所以这是个不折不扣的高阶函数。
这个输入的函数原型如下:
输入参数是元素的地址,然后通过返回一个正型来表示这两个元素的大小,进而影响排序的结果。
int数组排序的函数如下:
这里是升序,只要把a,b互换就变为了降序。还可以通过把指针类型转换对机构体进行比较排序。
通过以上这些可以看出qsort函数 设计的精巧,功能的强大。数组的输入通过void*屏蔽了具体的数据类型,后面比较函数的输入更是把排序的逻辑抛到了外部。由此使得这个函数变得无比的通用。
很早之前高阶函数就已经出现了,虽然不知道这个函数是什么时候编写的,但应该够老了吧。
高阶函数的使用使得这个函数的逻辑更高度的被抽象了,也就是通用性的来源。也就是函数行为和关键逻辑的分离。
这年头从来不缺技术的支持,缺的是抽象的能力啊~
小感慨一下,要想写好高阶函数真不是件容易的事啊。
其实关于这个名词,我相信很多人和我一样早就听说过。只是平时的工作几乎用大着,也就没太认真的思考过。
wiki英文版在此
看完后感觉还是挺简单的,不难理解。虽然wiki一如既往的啰嗦了一大堆,说得很学院。给出了很多编程语言的例子。bla bla bla~~
但其第一句就已经给出了定义。满足以下两个条件之一的函数。
takes one or more functions as an input 接受一个或多个函数做为输入 outputs a function 输出一个函数
关于现代众多的编程语言怎么支持高阶函数也就不多说了。说一下C语言的一个函数 stdlib qsort
这个函数写C的一定很熟悉。能够对任意类型的一块连续内存进行快速排序。原型如下:
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
前3个参数是描述输入的数组,1是地址,2是个元素个数,3是每个元素大小。最后是一个比较用的函数。所以这是个不折不扣的高阶函数。
这个输入的函数原型如下:
int compar (const void* p1, const void* p2);
输入参数是元素的地址,然后通过返回一个正型来表示这两个元素的大小,进而影响排序的结果。
int数组排序的函数如下:
int compare (const void * a, const void * b) { return ( *(int*)a - *(int*)b ); }
这里是升序,只要把a,b互换就变为了降序。还可以通过把指针类型转换对机构体进行比较排序。
通过以上这些可以看出qsort函数 设计的精巧,功能的强大。数组的输入通过void*屏蔽了具体的数据类型,后面比较函数的输入更是把排序的逻辑抛到了外部。由此使得这个函数变得无比的通用。
很早之前高阶函数就已经出现了,虽然不知道这个函数是什么时候编写的,但应该够老了吧。
高阶函数的使用使得这个函数的逻辑更高度的被抽象了,也就是通用性的来源。也就是函数行为和关键逻辑的分离。
这年头从来不缺技术的支持,缺的是抽象的能力啊~
小感慨一下,要想写好高阶函数真不是件容易的事啊。
相关文章推荐
- 简述系统调用的执行过程?
- 交互模式下python自动补全
- UVA 401
- 欢迎使用CSDN-markdown编辑器
- 利用inotify+rsync实现linux文件批量更新
- c++string
- 黄金当真只是魔鬼的粪便?钻石星球亮瞎你的眼
- Remove Duplicates from Sorted Array
- (网络视频监控)面试题12
- 遍历二叉树
- POJ1107
- android学习路线
- (数字电视机顶盒)笔试题
- webstorm 快捷键持续更新中...
- java继承分析
- poj 3660 Cow Contest
- 3D数学 矩阵和线性变换之正交投影
- HDU3285——5285dfs——wyh2000 and pupil
- Android疑惑篇------------含有button按钮的ListView中,列表项无法获取焦点的问题
- 假定某系统提供硬件的访管指令(例如形式:“svc n”),为了实现系统调用,系统设计者应做哪些工作?用户又如如何请求操作系统服务?