`
qiezi
  • 浏览: 491495 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

D语言的函数编程

    博客分类:
  • D
阅读更多
前阵子论坛上有人问我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呢?它的返回值类型如何出现在声明中呢?感觉很勉强啊。或许直接使用委托就是最好的选择。
分享到:
评论
1 楼 imagex 2007-01-09  
本人发了一条消息,请查收。

相关推荐

    纯函数编程语言Frege.zip

    Frege 是一个非严格的纯函数编程语言,其灵感来自于 Haskell,Frege 程序可编译成 Java 并在 JVM 中运行。 标签:Frege 分享 window._bd_share_...

    D程序设计语言.(美)Andrei.Alexandrescu著

    书中涵盖了D语言的方方面面,不但介绍了语言的表达式、语句、类型、函数、契约、模块、类和结构等基本内容,还通过常见示例,深入解释了所有语言特性,讲解了如何将语言特性进行组合以支持重要的编程范型,阐述了每...

    Damon: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 编程语言的科学库.zip

    scid, D 编程语言的科学库 SciD是一组编写在编程语言中的数字例程和绑定的集合。 它包含:scid.calculus: 数值集成( 正交) 和微分。scid.constants: 数学与自然的基本常数。scid.functions: 数学特殊函数。

    单相锁相环 在simulink中采用C语言实现锁相环,不是matlab编程语言if end 、for end,而是C语言,与D

    在simulink中采用C语言实现锁相环,不是matlab编程语言if end 、for end,而是C语言,与DSP和32编程中的语言一样,整个仿真没有一个模块,只有C需要写的锁相环函数,程序的运行频率和实际的开关频率一致。...

    R语言编程,献给所有做数据统计的程序员

    ·编程——管道操作的工作原理和替代方式,函数使用规则,如何实现迭代。 ·模型——深刻理解模型背后的数学理论和数据,直观认识统计模型工作原理。 ·沟通——学会R Markdown,让人们快速轻松理解你的工作。 名人...

    saslcompiler:SASL 的编译器,一种于 1972 年开发的函数式编程语言

    SASL 的编译器,一种于 1972 年开发的函数式编程语言 ( 。图宾根大学学生项目的结果。与 Benjamin Böhm 一起开发。 用法 测试可以运行 ant tests 构建可以运行 ant build 一个罐子可以用 ant jar 要么启动 sasl_...

    MySQL-for-D:适用于D编程语言MySQL本机客户端

    MySQL换D MySql for D是D编程语言的本机MySql客户端。 MySql for D完全用D编写,它不绑定或调用MySql的C函数。

    《大学计算机基础》程序设计-综合习题.doc

    为了方便人们记忆、阅读和编程,把机器语言进行符号化,相应的语言为【 】。A 高级语言 B 数据库语言 C 源程序 D 汇编语言 28. 能把高级语言编写的源程序进行转换,并生成机器语言形式的目标程序的系统软件为 【 】...

    CUDA编程指南5.0

    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语言(十六)网络编程/Socket、http

    Go语言中 Dial() 函数用于创建网络连接,函数原型如下: func Dial(network, address string) (Conn, error) { var d Dialer return d.Dial(network, address) } 参数说明如下: network 参数表示传入的网络协议...

    C++程序员如何用D编程

    有时候,当学习一门新语言时,这些习惯会因为太令人舒适而使人看不到新语言中等价的方法。所以下面收集了一些常用的 C++ 技术,以及如何在 D 中完成同样的任务。  C++  定义构造函数  C++ 的方式  构造函数...

    初中信息技术第一课用python编程(1)复习知识点试卷试题.doc

    下列不属于高级编程语言的是 A.C 语言 B.VB语言 C.Python语言 D.机器语言 3.Python中的数据类型float表示( ) A.布尔型 B.整型 C.字符串型 D.浮点型 4.在Python语言中,用来定义函数的关键字是( )。 A...

    西大成人教育计算机语言(VC)在线作业复习题.docx

    A类定义中只能说明函数成员的函数头,不能定义函数体 B类中的函数成员可以在类体中定义,也可以在类体之外定义 C类中的函数成员在类体之外定义时必须要与类声明在同一文件中 D在类体之外定义的函数成员不能操作该类...

    《JavaScript语言精粹[修订版]》高清版_2012.09_【蝴蝶书】_172页完整版

     JavaScript 曾是“世界上误解的语言”,因为它担负太多的特性,包括糟糕的交互和失败的设计,但随着Ajax 的到来,JavaScript“从受误解的编程语言演变为非常流行的语言”,这除了幸运之外,也证明了它其实是一门...

    汉诺塔java源码-LangBenchmarks:多种编程语言的性能基准

    作为奖励,还包括一些函数式逻辑编程语言。 目前基准支持: C C++ 目标-C C# D 帕斯卡 Java Scala 路亚 JavaScript 动作脚本3 Swift 去 PHP Ruby 派皮 Python 珀尔 重击 序言 二郎 通用 Lisp Clojure F# 哈斯克尔 ...

    C++语言程序设计自测练习(一)参考解答

    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编程精品练习.doc

    以下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.-...

    PHP函数参考手册大全

    D. 从 PHP/FI 2 移植到 PHP 3 E. PHP 的调试 F. 配置选项 G. php.ini 配置选项 H. 扩展库分类 I. 函数别名列表 J. 保留字列表 K. 资源类型列表 L. 支持的协议/封装协议列表 M. 可用过滤器列表 N. 所支持的套接字...

    最新中农大线上作业Java语言与面向对象程序设计A-F(1).doc

    面向对象实现 C.C++编程 D.文档收集 参考答案:B 您的答案:B 13、面向对象分析的主要目的就是开发人员在有用户参与协作下,明确用户需求,应用 标准化的面向对象模型规范地表述需求,最后形成面向对象的( )...

Global site tag (gtag.js) - Google Analytics