您的位置:首页 > 其它

高阶函数 Higher-order function

2015-07-20 20:34 309 查看
偶然看到一小段关于高阶函数的讨论。所以认真查了下。

其实关于这个名词,我相信很多人和我一样早就听说过。只是平时的工作几乎用大着,也就没太认真的思考过。

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*屏蔽了具体的数据类型,后面比较函数的输入更是把排序的逻辑抛到了外部。由此使得这个函数变得无比的通用。

很早之前高阶函数就已经出现了,虽然不知道这个函数是什么时候编写的,但应该够老了吧。

高阶函数的使用使得这个函数的逻辑更高度的被抽象了,也就是通用性的来源。也就是函数行为和关键逻辑的分离。

这年头从来不缺技术的支持,缺的是抽象的能力啊~

小感慨一下,要想写好高阶函数真不是件容易的事啊。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: