在函数式编程语言中,函数可以作为参数传递给另一个函数。在C/C++等编程语言中,引用函数的函数指针可以传递给可以通过取消引用调用外部函数的函数。
那么,函数指针在函数编程语言中是否与函数作为参数具有相同的表达能力呢?
发布于 2015-08-10 11:06:41
函数指针(例如,在C或C++中)只是某些机器代码的地址(计算某些函数)。它确实知道除了嵌入在代码中的常量以及它引用的static数据之外的任何数据。
从概念上(例如在兰伯达微积分中),函数既需要计算一些代码,也需要访问一些数据。因此,函数通常有有界变量,即封闭变量。因此,函数是代码和数据的混合,即闭锁。实际上,闭包不仅包含代码(一些“函数指针”la C),还包含数据。
注意,C++11引入了闭包、匿名函数(a.k.a )。( lambda-表达式)和std::function。
大多数(但不是所有)函数式语言(例如奥卡姆)都禁止比较函数(即闭包),因为从概念上讲,这意味着比较函数的行为(这是不可判定的,请阅读关于赖斯定理的文章)。
所以闭包比函数指针更有表现力。在这个答案中,我声称每个函数在概念上都是一个闭包(在C中,闭包值是static数据)。
由于C没有真正的闭包(但n2030建议将它们添加到未来的C2x标准中),大多数想要“闭包”的库实际上都采用了这样的约定:函数指针作为回调传递给一些显式客户端数据(模仿封闭值);一个简单的例子是GNU Q排序_r(3)。对于更复杂的示例,请查看GTK图形工具包的源代码和编码约定。
从实现和理论的角度来看,闭包混合了(类似于对象)数据和代码。在RefPerSys系统中,这个属性被使用,因为它的目标是生成越来越多的代码。
像Pi-微积分(由Davide Sangiori和David walker) ISBN 0-521-78177-9,或物体理论(马丁·阿巴迪和卢卡·卡德利) ISBN 0-387-94775-2或人工生命--意识机器的良知(雅克·皮拉特) ISBN 9781848211018或类型和编程语言(本杰明·皮尔斯) ISBN 9-780282-162098或编程语言理论(约翰·雷诺兹) ISBN 0-521-59414-8或克里斯蒂安·奎因尼克( Christian Queinnec)的小片Lisp --都比我所能解释的要好得多。
如果你能负担得起去大学图书馆或买书,我建议你去读。
发布于 2016-08-04 14:08:23
不,函数指针本身不具有可以作为参数传递的函数的表达能力,等等。
我想你可能想要一个5页以下的答案。
https://softwareengineering.stackexchange.com/questions/293250
复制相似问题