Pregunta

Estoy tratando de crear una función pura que devuelva la multiplicación de otras dos funciones puras:

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

Desafortunadamente, me estoy encontrando con problemas, el número uno, quiero declarar que F1 y F2 son funciones/delegados/clases puros con Opcall definido ... lo que se requiere porque los llamo desde una función pura.

Pero el número dos, y lo que parece ser el más problemático, es que quiero que F1 y F2 sean funciones de una, variable "real" que devuelve un valor "real" ... pero no puedo entender cómo plantarse esto afuera...

¿Alguien tiene alguna idea?

¿Fue útil?

Solución

En primer lugar, elimine el scope; Está mal, porque se escapan los ámbitos de los delegados.

En segundo lugar, intente algo como:

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;
}

También puede intentar hacer esto con plantillas, aunque no hay muchas razones para:

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()

Tenga en cuenta que hay insectos En el compilador que no permite que la pureza sea 100% correcta, por lo que solo tendrá que soportarlos por ahora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top