- 
      
- 
        Save bahmutov/1ec7a573ce5771caa9c7 to your computer and use it in GitHub Desktop. 
| // A: is this pure function? | |
| function sum(a, b) { return a + b } | |
| // B: is this a pure function? | |
| const k = 2 | |
| function addK(a) { return a + k } | |
| // C: is this a pure function? | |
| function sub(a, b) { return sum(a, -b) } | |
| // D: is this a pure function? | |
| function sub(a, b, summer) { return summer(a, b) } | |
| // E: is this a pure function? | |
| var sum = (a, b) => a + b | |
| function sub(a, b) { return sum(a, -b) } | |
| // F: is this a pure function? | |
| const sum = require('./sum') | |
| function sub(a, b) { return sum(a, -b) } | |
| // G: is this a pure function? | |
| const foo = eval('(function sum(a, b) { return a + b })') | |
| // H: is sub a pure function? | |
| const K = 10 | |
| function sub(a, b) { | |
| return function () { | |
| return a - b + K | |
| } | |
| } | |
| // I: is sub a pure function? | |
| // module sum.js | |
| module.exports = { | |
| sum: function sum(a, b) { return a + b } | |
| } | |
| // module index.js | |
| const sumThem = require('./sum').sum | |
| function sub(a, b) { | |
| return sumThem(a - b) | |
| } | 
According to @ericelliott, a pure function is a function which:
- Given the same input, will always return the same output.
- Produces no side effects.
- Relies on no external state.
So IMHO,
A. Yes.
B. No, breaks 3.
C. If sum is the same function from A (i.e. also pure), then yes.
D. Only if summer is pure
E. Yes.
F. Only if sum is pure
G. Kill me already. (I'd guess yes)
B:
addK is pure, it does not rely on external state. k is a constant, than can be replaced with value in addK without side effects. If k was a dictionary and e.g. k.foo was referred, then addK would be impure
G:
Pure in this case, param to eval is a constant. Undecidable in the general case (I can make-up a case, where you pass something awfully coupled with external state to eval, that still happens to return a pure function).
C and D are tricky, because calling a function can be considered a side effect, even if the function being called is pure. C is also technically dependent on external state.
@gunar s definition really depends on your definition of side effect, which is a tricky subject in js because even accessing a property can be an observable interaction because of defineproperty and proxies
Thanks guys for trying, I think everything can be thought of pure if we rewrite top level sum by substituting external variables with their values. This is why I disagree with everyone at least in case of E: it is NOT pure.
// E: is this a pure function?
var sum = (a, b) => a + b
function sub(a, b) { return sum(a, -b) }
sub(10, 1) // 9
sum = (a,b) => 0
sub(10, 1) // 0Function statements also have two states due to hoisting.
@bahmutov damn! Nice catch on E.
@jethrolarson I assume that every function has been hoisted already and we don't override functions with variables with same name
How would one determine which one is pure in JavaScript?
Relevant reading