- 论坛徽章:
- 1
|
我随便罗列一下 Haskell 里面的几个 C 里面没有的,但是有时候却很好用的特点:
1,partial application
2,curry
3,flip
等等等等,限于篇幅,我只说一下第一个:部分应用。
这个很有用,比如做 callback 的时候,如果是 C 语言的话,那么这个 callback 的接口是什么样,之前就定死了,
举个例子,比如 man ftw:
- int ftw(const char *path, int (*fn)(const char *,
- const struct stat *ptr, int flag), int ndirs);
复制代码
ftw 大意是说,给每个目录里的每个文件都调用一次中间那个 fn,
比如 fn 可以用下面这个函数填实:
- int printItem( const char *name, const struct stat *ptr, int flag )
- {
- fprintf( stdout, "found: [%s]\n", name );
- }
复制代码
这很不错,看起来它也能够工作。
但是现在我要用 ftw 了,却碰到了这样的一个需求:我需要用来作为 callback 的,实际上是下面这个函数!!
- int printItemToFile( FILE *fp, const char *name, const struct stat *ptr, int flag )
- {
- fprintf( fp, "found: [%s]\n", name );
- }
复制代码
没办法,这个信息得打印到文件里去,可惜我一开始也不知道要打印到哪个文件里去,这完全由我的调用者来决定。
这下糟糕了,ftw 工作起来似乎有些问题。
这可怎么办?
因为我只是回帖的时候临时想到了这个例子,没有仔细深入地思考过,是否有办法避免此问题,
不过我知道有许多 callback 为了实现这样的需求,设计的时候就加入了一个 void *userData 这样的参数来储存用户自己的私有数据。
但这看起来多少有些不美观。
Haskell 面对此类问题可以做得很美:
- foo = do
- ftw "/path/to/dir" printFile .......
- where printFile = printFileToHandler fp
复制代码
[ 本帖最后由 flw 于 2009-3-25 15:03 编辑 ] |
|