Чистая функция функций, которые возвращают функции в D
-
25-10-2019 - |
Вопрос
Я пытаюсь создать чистую функцию, которая возвращает умножение двух других чистых функций:
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 были функциями одной, «реальной» переменной, которая возвращает одно «реальное» значение ... но я не могу понять, как шаблон это ...
У кого -нибудь есть идеи?
Решение
Прежде всего, удалите 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% правильной, поэтому вам просто придется мириться с ними на данный момент.