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

Functional programming 返回D中函数的函数的纯函数,functional-programming,functor,d,pure-function,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

我试图创建一个纯函数,它返回另外两个纯函数的乘法:

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 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%正确,因此您现在只能忍受它们。

如果我不使用委托,而是使用函数指针,该怎么办?还是指定了opCall的类?这些可以隐式更改为委托吗?我喜欢第二个版本,并将不得不研究这一点,(它可能需要任何一组参数,只要它们对于F1和F2是相同的?)。还有,你说的bug是什么意思?我知道你不能把代表投给const(代表),纯洁性被削弱了,还有其他的吗?谢谢还有一件事,对于第二部分,如果函数在编译时是未知的,我还可以使用别名方法吗?@Andrew:你不能使用函数指针,因为根据定义,函数指针没有状态——也就是说,它们不能“记住”你的两个函数。对于带有
opCall
的类,如果你朝这个方向去,就使用第二个版本;第一个版本不适合它。:)所谓bug,我的意思是,你最终会遇到这样的情况:本来应该是纯的东西实际上是无法实现的(例如,尝试将内部函数声明为
pure
…),因为他们还在处理它。不过,DMD2.055应该有很多改进。安德鲁:理论上说,是的;你只要说“乘法器”!(funcptr1,funcptr2)。在实践中,您必须尝试一下并看到--我记得曾经有一个损坏错误(通常本地模板实例化会出现很多问题),但他们现在可能已经修复了大部分问题。我一直在尝试清理标记,因为它有时指的是纯虚拟函数,有时是对的,有时是对的。但我对这件事一无所知。你能确认我的标签编辑是否合适吗?对于这个问题,我已经创建了一个标签,所以如果可以的话,我认为最好使用现有的标签。