首页 > theory > CST > > 正文

functor的深入理解

发布人:zhoulujun@live.cn    点击:

关于 monads 和 functors 有一件很重要的事情,就是数学家们也在范畴论中研究这些观点。这不仅帮助我们理解程序的框架,而且提供了可用于在编译时静态分析和优化我们的代码代数定理和证明。这是 Haskell 的好处之一-Glasgow Haskel

functor,词典查了下

觉得在计算机里面 应该叫功能元件比较好些

20160922203221253.png

实现functor - 增强型的函数指针

http://www.cppblog.com/kevinlynx/archive/2008/03/17/44678.html


这个解释好点:但是是英文版

http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html

需求:

开发一种组件,用以包装C函数、通常的函数对象、成员函数,使其对外保持一种一致的接口。我将最终的
组件称为functor,这里的functor与loki中的functor以及boost中的function功能一致,同STL中的functor
在概念层次上可以说也是一样的。那么,functor其实也可以进一步传进其他functor构成新的functor。

C++世界里还有一种组件,称做bind(er),例如STL中的binder1st、binder2nd,以及boost中的bind。所谓
的bind是将一些参数与函数之类的关联起来,当执行该bind创建的对象时,库会自动将之前bind的参数传
递给bind创建的对象。bind创建出来的对象在某种程度上来说也是一种functor。

实现:

包装C函数和函数对象的functor事实上是一致的,而实现包装成员函数的functor则需要多传入一个对象参数。
因此这里先讨论包装C函数和函数对象的functor。

包装C函数:

思考下各种不同的C函数的共同点和不同点,共同点就是这些函数都有一个返回值,参数个数可能相同,可能
不同,参数类型可能相同可能不同。考虑到模板对于类型的泛化特性,对于参数类型来说,可以轻松实现无
关性。而至于参数个数的泛化,则要复杂点。这里先考虑实现参数个数为1个的functor: