前阵子论坛上有人问我D语言做函数编程怎样,老实说我没怎么想过这问题。现在想来,D语言可以有函数指针、委托、仿函数(opCall),所以它和C++基本上没什么不一样。
想起了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呢?它的返回值类型如何出现在声明中呢?感觉很勉强啊。或许直接使用委托就是最好的选择。
分享到:
相关推荐
Frege 是一个非严格的纯函数编程语言,其灵感来自于 Haskell,Frege 程序可编译成 Java 并在 JVM 中运行。 标签:Frege 分享 window._bd_share_...
书中涵盖了D语言的方方面面,不但介绍了语言的表达式、语句、类型、函数、契约、模块、类和结构等基本内容,还通过常见示例,深入解释了所有语言特性,讲解了如何将语言特性进行组合以支持重要的编程范型,阐述了每...
这是什么: Damon 尝试用函数式编程概念为 D 编程语言增添趣味。汇编$ git clone git@github.com:Snaipe/Damon.git$ cd Damon$ dub test特征:咖喱: auto square_and_add = ( long x, int y) => x * x + y;auto ...
scid, D 编程语言的科学库 SciD是一组编写在编程语言中的数字例程和绑定的集合。 它包含:scid.calculus: 数值集成( 正交) 和微分。scid.constants: 数学与自然的基本常数。scid.functions: 数学特殊函数。
在simulink中采用C语言实现锁相环,不是matlab编程语言if end 、for end,而是C语言,与DSP和32编程中的语言一样,整个仿真没有一个模块,只有C需要写的锁相环函数,程序的运行频率和实际的开关频率一致。...
·编程——管道操作的工作原理和替代方式,函数使用规则,如何实现迭代。 ·模型——深刻理解模型背后的数学理论和数据,直观认识统计模型工作原理。 ·沟通——学会R Markdown,让人们快速轻松理解你的工作。 名人...
SASL 的编译器,一种于 1972 年开发的函数式编程语言 ( 。图宾根大学学生项目的结果。与 Benjamin Böhm 一起开发。 用法 测试可以运行 ant tests 构建可以运行 ant build 一个罐子可以用 ant jar 要么启动 sasl_...
MySQL换D MySql for D是D编程语言的本机MySql客户端。 MySql for D完全用D编写,它不绑定或调用MySql的C函数。
为了方便人们记忆、阅读和编程,把机器语言进行符号化,相应的语言为【 】。A 高级语言 B 数据库语言 C 源程序 D 汇编语言 28. 能把高级语言编写的源程序进行转换,并生成机器语言形式的目标程序的系统软件为 【 】...
1.3 一种可扩展的编程模型 3 1.4 文档结构 4 第二章编程模型 7 2.1 内核 7 2.2 线程层次 8 2.3 存储器层次 11 2.4 异构编程 11 2.5 计算能力 11 第三章编程接口 15 3.1 用nvcc编译 15 3.1.1 编译流程 16 3.1.1.1 ...
Go语言中 Dial() 函数用于创建网络连接,函数原型如下: func Dial(network, address string) (Conn, error) { var d Dialer return d.Dial(network, address) } 参数说明如下: network 参数表示传入的网络协议...
有时候,当学习一门新语言时,这些习惯会因为太令人舒适而使人看不到新语言中等价的方法。所以下面收集了一些常用的 C++ 技术,以及如何在 D 中完成同样的任务。 C++ 定义构造函数 C++ 的方式 构造函数...
下列不属于高级编程语言的是 A.C 语言 B.VB语言 C.Python语言 D.机器语言 3.Python中的数据类型float表示( ) A.布尔型 B.整型 C.字符串型 D.浮点型 4.在Python语言中,用来定义函数的关键字是( )。 A...
A类定义中只能说明函数成员的函数头,不能定义函数体 B类中的函数成员可以在类体中定义,也可以在类体之外定义 C类中的函数成员在类体之外定义时必须要与类声明在同一文件中 D在类体之外定义的函数成员不能操作该类...
JavaScript 曾是“世界上误解的语言”,因为它担负太多的特性,包括糟糕的交互和失败的设计,但随着Ajax 的到来,JavaScript“从受误解的编程语言演变为非常流行的语言”,这除了幸运之外,也证明了它其实是一门...
作为奖励,还包括一些函数式逻辑编程语言。 目前基准支持: C C++ 目标-C C# D 帕斯卡 Java Scala 路亚 JavaScript 动作脚本3 Swift 去 PHP Ruby 派皮 Python 珀尔 重击 序言 二郎 通用 Lisp Clojure F# 哈斯克尔 ...
C++语言程序设计自测练习(一)参考解答 一、单项选择题 1. A 2. C 3. B 4. B 5. B 6. C 7. A 8. D 9. B 10. D 11. D 12. C 13. D 14. D 15. C 16. A 17. B 18. A 19. C 20. B 21. B 22. C 23. C 24. B 25. D 26. ...
以下Python中变量的命名正确的是( ) A.1a=4 B.print=5 C._A=2 D.a+b=3 2.Python输入函数为( )。 A.time() B.round() C.input( ) D.print() 3.在Python中print(-14//4)的运行结果是( )。 A.-4 B.-...
D. 从 PHP/FI 2 移植到 PHP 3 E. PHP 的调试 F. 配置选项 G. php.ini 配置选项 H. 扩展库分类 I. 函数别名列表 J. 保留字列表 K. 资源类型列表 L. 支持的协议/封装协议列表 M. 可用过滤器列表 N. 所支持的套接字...
面向对象实现 C.C++编程 D.文档收集 参考答案:B 您的答案:B 13、面向对象分析的主要目的就是开发人员在有用户参与协作下,明确用户需求,应用 标准化的面向对象模型规范地表述需求,最后形成面向对象的( )...