Friday 23 December 2016

javascript - Higher order function returns pure function



Here's an example of an higher order function called functionA that has customValue as input and returns a function that gets an input and uses the custom value to elaborate a result:




let functionA = (customValue) => {
let value = customValue || 1;
return input => input * value;
};


Here's some results:



functionA()(4)             
// => returns 4


functionA(2)(4)
// => returns 8

functionA(3)(4)
// => returns 12

functionA(4)(4)
// => returns 16



Can the function returned by functionA be considered pure?



UPDATE: the examples above are only using numeric input. As described by @CRice, the returned function can be considered pure only when customValue is constant and doesn't have internal state (like classes).


Answer



Using this definition of Pure Function:




In computer programming, a pure function is a function that has the
following properties:





  1. Its return value is the same for the same arguments (no variation with
    local static variables, non-local variables, mutable reference
    arguments or input streams from I/O devices).


  2. Its evaluation has no
    side effects (no mutation of local static variables, non-local
    variables, mutable reference arguments or I/O streams).






Then, no, functionA will not always return a pure function.



Here is a way to use functionA so that it does not return a pure function:





let functionA = (customValue) => {
let value = customValue || 1;
return input => input * value;

};

class Mutater {
constructor() {
this.i = 0;
}
valueOf() {
return this.i++;
}
}


const nonPureFunction = functionA(new Mutater());

// Produces different results for same input, eg: not pure.
console.log(nonPureFunction(10));
console.log(nonPureFunction(10));






As you can see, the returned function, when given the same input (10), produces a different result. This violates the first condition from the above definition (and using the same trick you could also violate the second).


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...