чистая функция функций, которая возвращает функции в D - PullRequest
2 голосов
/ 24 июля 2011

Я пытаюсь создать чистую функцию, которая возвращает умножение двух других чистых функций:

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 были функциями одной, «реальной» переменной, которая возвращает одно «реальное» значение ... но я не могу понять, как шаблонизировать это ...

У кого-нибудь есть идеи?

1 Ответ

3 голосов
/ 24 июля 2011

Прежде всего, удалите 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% правильной, поэтому вам просто придется с этим смириться.

...