返回D中函数的函数的纯函数

时间:2011-07-24 07:43:34

标签: functional-programming functor d pure-function

我正在尝试创建一个返回两个其他纯函数乘法的纯函数:

pure Func multiplyFunctions(Func,Real)(scope const Func f1, scope const Func f2)
{
    return (Real a) { return f1(a) * f2(a); };
}

不幸的是,我遇到了问题,第一,我想声明f1和f2是纯函数/委托/类,并且opCall已定义...这是必需的,因为我是从纯函数调用它们的。

但是第二,而且似乎最成问题的是,我希望f1和f2是一个函数,“Real”变量返回一个“Real”值...但我无法弄清楚如何模板化......

有人有什么想法吗?

1 个答案:

答案 0 :(得分:3)

首先,删除scope;这是错误的,因为代表的范围是转义的。

其次,尝试类似:

real delegate(real) multiplier(const real delegate(real) pure f1,
                               const real delegate(real) pure f2) pure
{
    real multiply(real val) { return f1(val) * f2(val); }
    return &multiply;
}

您也可以尝试使用模板执行此操作,但没有太多理由:

pure auto multiplier(alias F1, alias F2)(ParameterTypeTuple!F1 args)
{
    return F1(args) * F2(args);
}

real square(real a) pure { return a * a; }

alias multiplier!(square, square) squareMultiplier;

//Now squareMultiplier is a multiplier of square()

请注意,编译器中存在错误,不允许纯度100%正确,因此您现在必须忍受它们。