【问题标题】:pure function of functions that returns functions in D返回 D 中函数的函数的纯函数
【发布时间】:2011-07-24 07:43:33
【问题描述】:

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

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”变量的函数......但我不知道如何将其模板化...

有人有什么想法吗?

【问题讨论】:

  • 我一直在尝试清理pure 标签,因为它有时指的是纯虚函数,有时指的是pure,有时指的是pure - 等等。但我对d2 一无所知。您能否确认我的标签编辑是否合适? purely-functional 可以解决这个问题吗?我创建了pure-function,所以如果purely-functional 有效,我认为使用现有标签会更好。

标签: functional-programming functor d pure-function


【解决方案1】:

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

【讨论】:

  • 如果我不使用委托,而是使用函数指针怎么办?还是指定了 opCall 的类?这些可以隐式更改为委托吗?我喜欢第二个版本,并且必须研究一下,(它可以采用任何一组参数,只要它们对于 F1 和 F2 是相同的?)。另外,你说的bug是什么意思?我知道您不能将代表转换为 const(delegates),并且纯度已被削弱,还有其他的吗?谢谢!
  • 还有一件事,对于第二部分,如果函数在编译时是未知的,我还可以使用别名方法吗?
  • @Andrew:你不能使用函数指针,因为根据定义,函数指针没有状态——即它们无法“记住”您的两个功能。至于opCall的类,如果你往那个方向走,就用第二个版本;第一个版本不适合它。 :) 通过错误,我的意思是你最终会遇到一些应该能够成为纯的东西实际上无法做到的地步(例如,尝试将内部函数声明为 pure...),因为他们仍在努力。不过,DMD 2.055 应该有很多改进。我现在不知道具体的其他人。
  • @Andrew:理论上,是的;你就说multiplier!(funcptr1, funcptr2)。在实践中,你必须尝试看看——我记得曾经有一个损坏错误(本地模板实例化通常存在很多问题),但他们现在可能已经修复了大部分问题。
猜你喜欢
  • 1970-01-01
  • 2019-10-05
  • 2011-08-14
  • 2015-10-31
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 2015-02-13
相关资源
最近更新 更多