2007-01-07
D语言的函数编程
前阵子论坛上有人问我D语言做函数编程怎样,老实说我没怎么想过这问题。现在想来,D语言可以有函数指针、委托、仿函数(opCall),所以它和C++基本上没什么不一样。
想起了python,虽然以前没研究过它的函数编程,不过还是搜索了一下,IBM Developer Works的“可爱的python系列”格式乱得没法看,就没继续看了。从中找出python的几个算子比如map, reduce, filter,在D语言中实现这个应该也是简单的:
reduce实现稍麻烦点,因为涉及到类型,比如python可以这样用:
这时因为x+y和x的类型相同,用D实现这个版本也不麻烦,但python还可以使用不同类型:
这种用D来实现就不大容易了,因为返回值类型也可能不确定。
使用:
看起来真丑。。为什么不能直接调用map(&std.string.toString, arr)呢?因为std.string.toString是个重载函数,在这里它不能决议。
我想的另一个办法是使用仿函数:
不过,如何来写这个map呢?它的返回值类型如何出现在声明中呢?感觉很勉强啊。或许直接使用委托就是最好的选择。
想起了python,虽然以前没研究过它的函数编程,不过还是搜索了一下,IBM Developer Works的“可爱的python系列”格式乱得没法看,就没继续看了。从中找出python的几个算子比如map, reduce, filter,在D语言中实现这个应该也是简单的:
R[] map(R, T)(R delegate(T) dg, T[] arr){
R[] result = new R[arr.length];
foreach(int idx, T v; arr)
result[idx] = dg(v);
return result;
}
T[] filter(T)(bool delegate(T) dg, T[] arr){
T[] result = new T[0];
foreach(T v; arr)
if (dg(v))
result ~= v;
return result;
}
reduce实现稍麻烦点,因为涉及到类型,比如python可以这样用:
reduce(lambda x,y: x + y, [1,2,3,4,5])
这时因为x+y和x的类型相同,用D实现这个版本也不麻烦,但python还可以使用不同类型:
reduce(lambda x,y: str(x) + str(y), [1,2,3,4,5])
这种用D来实现就不大容易了,因为返回值类型也可能不确定。
使用:
void main(){
int[] arr = [1,2,3,4,5];
writefln(arr);
int[] arr1 = filter(delegate bool (int i){ return i % 2 == 0;}, arr);
writefln(arr1);
char[][] arr2 = map(delegate char[] (int i){return std.string.toString(i);}, arr);
writefln(arr2);
}
看起来真丑。。为什么不能直接调用map(&std.string.toString, arr)呢?因为std.string.toString是个重载函数,在这里它不能决议。
我想的另一个办法是使用仿函数:
class ToString{
public char[] opCall(T)(T v){
return std.string.toString(v);
}
}
map(new ToString, [1,2,3,4,5]);
不过,如何来写这个map呢?它的返回值类型如何出现在声明中呢?感觉很勉强啊。或许直接使用委托就是最好的选择。
发表评论
- 浏览: 179668 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
链接
最新评论
-
使用C#的Generator编写并 ...
不懂C#,老兄能不能给个c++的代码?谢谢先!
-- by vdgame -
Erlang/IoLanguage/Ruby
那热升级的问题怎么处理?
-- by zgd -
标准库的效率--适时选择自 ...
请教:C++中generator用什么实现?另外,libevent大概不支持文件 ...
-- by dayn9 -
云计算的架构
这个是一回事。google那个只支持python,就不看了。amazon的ec2 ...
-- by cookoo -
标准库的效率--适时选择自 ...
哦。我的意思是说使用池也只是少量提升性能而已,对于有些应用来说绝对不要使用这些库 ...
-- by qiezi






评论排行榜