`
qiezi
  • 浏览: 497753 次
  • 性别: 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  
本人发了一条消息,请查收。

相关推荐

    D语言编程参考手册

    ### D语言编程参考手册知识点概览 #### 一、D语言简介 **D语言**是一种通用的编程语言,主要用于系统和应用级别的开发。它被设计为比C++更高级,同时保留了C++的一些关键特性,例如能够生成高效的机器码,并且可以...

    D 语言编程中文参考手册

    D语言是一种现代、通用、面向对象的编程语言,它的设计目标是高效、灵活性高,并且具有C/C++的性能。D语言由Walter Bright在2001年创建,至今已发展到2.0版本,提供了许多现代编程语言的特性。本参考手册详细介绍了D...

    D 语言 2.0 编程参考手册(上,中,下)

    8. **元编程**:D语言的元编程能力非常强,允许在编译期间执行代码,生成新的类型和函数。这是通过模板元编程和`__traits`系统实现的。 9. **标准库**:D语言的标准库(Phobos)包含了大量实用的模块,涵盖了I/O、...

    纯函数编程语言Frege.zip

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

    D_语言_2.0_编程参考手册

    在D语言2.0中,语法简洁明了,支持面向对象、函数式以及过程式编程,同时具备C++的高效性和Python的易用性。手册上篇可能涵盖以下几个核心知识点: 1. **基础语法**:包括变量声明、数据类型(如基本类型、结构体、...

    D语言编程手册上pdf

    ### D语言编程手册知识点梳理 #### 一、D语言概览 - **D语言起源与发展**:D语言是由Walter Bright设计的一种通用编程语言,旨在解决C++中存在的问题,并引入了现代语言的一些特性。该语言的目标是提高开发效率的...

    D 语言编程参考手册 1[1].0(上).

    其中,调用约定(Calling Conventions)是指函数参数传递的方式,D语言支持多种调用约定,如`cdecl`、`pascal`、`stdcall`、`fastcall`等,以适应不同的编程需求。 #### 五、D语言与C语言的交互 D语言能够无缝地与...

    D语言程序设计(用D语言编程)

    **D语言**是一种现代、通用、系统级的编程语言,旨在提供高效且安全的编程体验。它由Digital Mars开发,版本为DMD 0.109,文档经过翻译,其中大部分版权归属uframer,另有部分版权归属于qiezi和ideage。 #### 二、D...

    D语言中文文档 D语言中文文档

    6. **标准库**:D语言的标准库提供了丰富的功能,包括I/O操作、网络编程、字符串处理、数学函数等,为开发提供了便利。 7. **元编程**:D语言的元编程能力非常强大,允许在编译时进行代码生成和分析,大大扩展了...

    D语言的中文文档

    3. **模板**:D语言的模板类似于C++的模板,允许创建泛型函数和类,实现代码重用,减少冗余。 4. **内存管理**:D语言提供了垃圾回收机制,自动管理内存,但同时也允许程序员直接控制内存,以满足对性能有高要求的...

    D语言真相 The Case for D(1-5)

    首先,D语言的语法设计十分精巧,它吸取了C++的面向对象特性,如类、继承和多态,并且引入了更现代的特性,如泛型编程、匿名函数和闭包。这使得D语言在处理复杂数据结构和算法时更加灵活,同时也保留了底层控制的...

    D语言编程参考手册1.0

    ### D语言编程参考手册知识点概览 #### 一、D语言背景及特点 **D语言**是由Digital Mars公司开发的一种编程语言,旨在改进C++语言的一些不足之处。它结合了C语言的强大性能与Python和Ruby等语言的高效开发速度。 ...

    D 语言详细教程

    - 类:D语言采用面向对象编程,支持类的定义,包含构造函数、析构函数、属性和方法。 - 继承与多态:D支持单一继承,但通过接口可以实现多重接口继承。多态通过虚函数和抽象类实现。 - 访问控制:D语言有public、...

    D_语言编程参考手册_2.0(上).pdf

    D语言是一种现代、高效的系统编程语言,它结合了面向对象、函数式和过程式编程的特性,旨在提高开发效率和代码质量。 D语言的设计目标是成为C++的替代品,但同时也吸取了其他现代编程语言的优点。其语法简洁明了,...

Global site tag (gtag.js) - Google Analytics