Pure Functions: Does “No Side Effects” Imply “Always Same Output, Given Same Input”?
The two conditions that define a function as pure
are as follows:
- No side effects (i.e. only changes to local scope are allowed)
- Always return the same output, given the same input
If the first condition is always true, are there any times the second condition is not true?
I.e. is it really only necessary with the first condition?
javascript functional-programming pure-function
add a comment |
The two conditions that define a function as pure
are as follows:
- No side effects (i.e. only changes to local scope are allowed)
- Always return the same output, given the same input
If the first condition is always true, are there any times the second condition is not true?
I.e. is it really only necessary with the first condition?
javascript functional-programming pure-function
add a comment |
The two conditions that define a function as pure
are as follows:
- No side effects (i.e. only changes to local scope are allowed)
- Always return the same output, given the same input
If the first condition is always true, are there any times the second condition is not true?
I.e. is it really only necessary with the first condition?
javascript functional-programming pure-function
The two conditions that define a function as pure
are as follows:
- No side effects (i.e. only changes to local scope are allowed)
- Always return the same output, given the same input
If the first condition is always true, are there any times the second condition is not true?
I.e. is it really only necessary with the first condition?
javascript functional-programming pure-function
javascript functional-programming pure-function
edited 2 hours ago
Code-Apprentice
48k1490178
48k1490178
asked 4 hours ago
MagnusMagnus
1,40011025
1,40011025
add a comment |
add a comment |
4 Answers
4
active
oldest
votes
Here are a few counterexamples that do not change the outer scope but are still considered impure:
function a() { return Date.now(); }
function b() { return window.globalMutableVar; }
function c() { return prompt("you choose"); }
function d() { return Math.random(); }
(which admittedly does change the PRNG, but is not considered observable)
Accessing non-constant non-local variables is enough to be able to violate the second condition, the function doesn't need to have any side effect itself if it is going to be affected by other side effects.
add a comment |
It seems to me that the second condition you have described is a weaker constraint than the first.
Let me give you an example, suppose you have a function to add one that also logs to the console:
function addOneAndLog(x) {
console.log(x);
return x + 1;
}
The second condition you supplied is satisfied: this function always returns the same output when given the same input. It is, however, not a pure function because it includes the side effect of logging to the console.
A pure function is, strictly speaking, a function that satisfies the property of referential transparency. That is the property that we can replace a function application with the value it produces without changing the behaviour of the program.
Suppose we have a function that simply adds:
function addOne(x) {
return x + 1;
}
We can replace addOne(5)
with 6
anywhere in our program and nothing will change.
By contrast, we cannot replace addOneAndLog(x)
with the value 6
anywhere in our program without changing behaviour because the first expression results in something being written to the console whereas the second one does not.
We consider any of this extra behaviour that addOneAndLog(x)
performs besides returning output as a side-effect.
this doesn't address the question
– Empty
1 hour ago
add a comment |
You could have a source of randomness from outside the system. Say part of your calculation includes the room temperature. Executing the function will yield different results each time (depending on the external random element) but you don't really change the state of your program by executing it.
All I can think of, anyway.
According to me, these "randomness from outside the system" are a form of side effect. Functions with these behaviors are not "pures".
– Joseph M. Dion
1 hour ago
add a comment |
I would say that the point 2 (Always return the same output, given the same input) is not a condition but a consequence of point 1 : a function without side effects will always return the same output given the same input.
1
That is the whole point of the question. The OP is asking why is it necessary to list both when it seems that one is a consequence of the other. However, the examples above show some good counter examples.
– Code-Apprentice
2 hours ago
It's possible to have a function with side effects but always returning the same output for an input (console.log(x);return x
), and it's possible to have a function with no side effects that returns different values for a given input (return Date.now() + x
). The two conditions are independent.
– Mark
1 hour ago
According to me, the function (return Date.now() + x) is a fonction WITH side effect because it reads something from the outside world (the time).
– Joseph M. Dion
1 hour ago
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54992302%2fpure-functions-does-no-side-effects-imply-always-same-output-given-same-inp%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
Here are a few counterexamples that do not change the outer scope but are still considered impure:
function a() { return Date.now(); }
function b() { return window.globalMutableVar; }
function c() { return prompt("you choose"); }
function d() { return Math.random(); }
(which admittedly does change the PRNG, but is not considered observable)
Accessing non-constant non-local variables is enough to be able to violate the second condition, the function doesn't need to have any side effect itself if it is going to be affected by other side effects.
add a comment |
Here are a few counterexamples that do not change the outer scope but are still considered impure:
function a() { return Date.now(); }
function b() { return window.globalMutableVar; }
function c() { return prompt("you choose"); }
function d() { return Math.random(); }
(which admittedly does change the PRNG, but is not considered observable)
Accessing non-constant non-local variables is enough to be able to violate the second condition, the function doesn't need to have any side effect itself if it is going to be affected by other side effects.
add a comment |
Here are a few counterexamples that do not change the outer scope but are still considered impure:
function a() { return Date.now(); }
function b() { return window.globalMutableVar; }
function c() { return prompt("you choose"); }
function d() { return Math.random(); }
(which admittedly does change the PRNG, but is not considered observable)
Accessing non-constant non-local variables is enough to be able to violate the second condition, the function doesn't need to have any side effect itself if it is going to be affected by other side effects.
Here are a few counterexamples that do not change the outer scope but are still considered impure:
function a() { return Date.now(); }
function b() { return window.globalMutableVar; }
function c() { return prompt("you choose"); }
function d() { return Math.random(); }
(which admittedly does change the PRNG, but is not considered observable)
Accessing non-constant non-local variables is enough to be able to violate the second condition, the function doesn't need to have any side effect itself if it is going to be affected by other side effects.
edited 4 hours ago
answered 4 hours ago
BergiBergi
375k60566899
375k60566899
add a comment |
add a comment |
It seems to me that the second condition you have described is a weaker constraint than the first.
Let me give you an example, suppose you have a function to add one that also logs to the console:
function addOneAndLog(x) {
console.log(x);
return x + 1;
}
The second condition you supplied is satisfied: this function always returns the same output when given the same input. It is, however, not a pure function because it includes the side effect of logging to the console.
A pure function is, strictly speaking, a function that satisfies the property of referential transparency. That is the property that we can replace a function application with the value it produces without changing the behaviour of the program.
Suppose we have a function that simply adds:
function addOne(x) {
return x + 1;
}
We can replace addOne(5)
with 6
anywhere in our program and nothing will change.
By contrast, we cannot replace addOneAndLog(x)
with the value 6
anywhere in our program without changing behaviour because the first expression results in something being written to the console whereas the second one does not.
We consider any of this extra behaviour that addOneAndLog(x)
performs besides returning output as a side-effect.
this doesn't address the question
– Empty
1 hour ago
add a comment |
It seems to me that the second condition you have described is a weaker constraint than the first.
Let me give you an example, suppose you have a function to add one that also logs to the console:
function addOneAndLog(x) {
console.log(x);
return x + 1;
}
The second condition you supplied is satisfied: this function always returns the same output when given the same input. It is, however, not a pure function because it includes the side effect of logging to the console.
A pure function is, strictly speaking, a function that satisfies the property of referential transparency. That is the property that we can replace a function application with the value it produces without changing the behaviour of the program.
Suppose we have a function that simply adds:
function addOne(x) {
return x + 1;
}
We can replace addOne(5)
with 6
anywhere in our program and nothing will change.
By contrast, we cannot replace addOneAndLog(x)
with the value 6
anywhere in our program without changing behaviour because the first expression results in something being written to the console whereas the second one does not.
We consider any of this extra behaviour that addOneAndLog(x)
performs besides returning output as a side-effect.
this doesn't address the question
– Empty
1 hour ago
add a comment |
It seems to me that the second condition you have described is a weaker constraint than the first.
Let me give you an example, suppose you have a function to add one that also logs to the console:
function addOneAndLog(x) {
console.log(x);
return x + 1;
}
The second condition you supplied is satisfied: this function always returns the same output when given the same input. It is, however, not a pure function because it includes the side effect of logging to the console.
A pure function is, strictly speaking, a function that satisfies the property of referential transparency. That is the property that we can replace a function application with the value it produces without changing the behaviour of the program.
Suppose we have a function that simply adds:
function addOne(x) {
return x + 1;
}
We can replace addOne(5)
with 6
anywhere in our program and nothing will change.
By contrast, we cannot replace addOneAndLog(x)
with the value 6
anywhere in our program without changing behaviour because the first expression results in something being written to the console whereas the second one does not.
We consider any of this extra behaviour that addOneAndLog(x)
performs besides returning output as a side-effect.
It seems to me that the second condition you have described is a weaker constraint than the first.
Let me give you an example, suppose you have a function to add one that also logs to the console:
function addOneAndLog(x) {
console.log(x);
return x + 1;
}
The second condition you supplied is satisfied: this function always returns the same output when given the same input. It is, however, not a pure function because it includes the side effect of logging to the console.
A pure function is, strictly speaking, a function that satisfies the property of referential transparency. That is the property that we can replace a function application with the value it produces without changing the behaviour of the program.
Suppose we have a function that simply adds:
function addOne(x) {
return x + 1;
}
We can replace addOne(5)
with 6
anywhere in our program and nothing will change.
By contrast, we cannot replace addOneAndLog(x)
with the value 6
anywhere in our program without changing behaviour because the first expression results in something being written to the console whereas the second one does not.
We consider any of this extra behaviour that addOneAndLog(x)
performs besides returning output as a side-effect.
answered 3 hours ago
TheInnerLightTheInnerLight
10.4k11942
10.4k11942
this doesn't address the question
– Empty
1 hour ago
add a comment |
this doesn't address the question
– Empty
1 hour ago
this doesn't address the question
– Empty
1 hour ago
this doesn't address the question
– Empty
1 hour ago
add a comment |
You could have a source of randomness from outside the system. Say part of your calculation includes the room temperature. Executing the function will yield different results each time (depending on the external random element) but you don't really change the state of your program by executing it.
All I can think of, anyway.
According to me, these "randomness from outside the system" are a form of side effect. Functions with these behaviors are not "pures".
– Joseph M. Dion
1 hour ago
add a comment |
You could have a source of randomness from outside the system. Say part of your calculation includes the room temperature. Executing the function will yield different results each time (depending on the external random element) but you don't really change the state of your program by executing it.
All I can think of, anyway.
According to me, these "randomness from outside the system" are a form of side effect. Functions with these behaviors are not "pures".
– Joseph M. Dion
1 hour ago
add a comment |
You could have a source of randomness from outside the system. Say part of your calculation includes the room temperature. Executing the function will yield different results each time (depending on the external random element) but you don't really change the state of your program by executing it.
All I can think of, anyway.
You could have a source of randomness from outside the system. Say part of your calculation includes the room temperature. Executing the function will yield different results each time (depending on the external random element) but you don't really change the state of your program by executing it.
All I can think of, anyway.
answered 4 hours ago
user3340459user3340459
7027
7027
According to me, these "randomness from outside the system" are a form of side effect. Functions with these behaviors are not "pures".
– Joseph M. Dion
1 hour ago
add a comment |
According to me, these "randomness from outside the system" are a form of side effect. Functions with these behaviors are not "pures".
– Joseph M. Dion
1 hour ago
According to me, these "randomness from outside the system" are a form of side effect. Functions with these behaviors are not "pures".
– Joseph M. Dion
1 hour ago
According to me, these "randomness from outside the system" are a form of side effect. Functions with these behaviors are not "pures".
– Joseph M. Dion
1 hour ago
add a comment |
I would say that the point 2 (Always return the same output, given the same input) is not a condition but a consequence of point 1 : a function without side effects will always return the same output given the same input.
1
That is the whole point of the question. The OP is asking why is it necessary to list both when it seems that one is a consequence of the other. However, the examples above show some good counter examples.
– Code-Apprentice
2 hours ago
It's possible to have a function with side effects but always returning the same output for an input (console.log(x);return x
), and it's possible to have a function with no side effects that returns different values for a given input (return Date.now() + x
). The two conditions are independent.
– Mark
1 hour ago
According to me, the function (return Date.now() + x) is a fonction WITH side effect because it reads something from the outside world (the time).
– Joseph M. Dion
1 hour ago
add a comment |
I would say that the point 2 (Always return the same output, given the same input) is not a condition but a consequence of point 1 : a function without side effects will always return the same output given the same input.
1
That is the whole point of the question. The OP is asking why is it necessary to list both when it seems that one is a consequence of the other. However, the examples above show some good counter examples.
– Code-Apprentice
2 hours ago
It's possible to have a function with side effects but always returning the same output for an input (console.log(x);return x
), and it's possible to have a function with no side effects that returns different values for a given input (return Date.now() + x
). The two conditions are independent.
– Mark
1 hour ago
According to me, the function (return Date.now() + x) is a fonction WITH side effect because it reads something from the outside world (the time).
– Joseph M. Dion
1 hour ago
add a comment |
I would say that the point 2 (Always return the same output, given the same input) is not a condition but a consequence of point 1 : a function without side effects will always return the same output given the same input.
I would say that the point 2 (Always return the same output, given the same input) is not a condition but a consequence of point 1 : a function without side effects will always return the same output given the same input.
answered 2 hours ago
Joseph M. DionJoseph M. Dion
1724
1724
1
That is the whole point of the question. The OP is asking why is it necessary to list both when it seems that one is a consequence of the other. However, the examples above show some good counter examples.
– Code-Apprentice
2 hours ago
It's possible to have a function with side effects but always returning the same output for an input (console.log(x);return x
), and it's possible to have a function with no side effects that returns different values for a given input (return Date.now() + x
). The two conditions are independent.
– Mark
1 hour ago
According to me, the function (return Date.now() + x) is a fonction WITH side effect because it reads something from the outside world (the time).
– Joseph M. Dion
1 hour ago
add a comment |
1
That is the whole point of the question. The OP is asking why is it necessary to list both when it seems that one is a consequence of the other. However, the examples above show some good counter examples.
– Code-Apprentice
2 hours ago
It's possible to have a function with side effects but always returning the same output for an input (console.log(x);return x
), and it's possible to have a function with no side effects that returns different values for a given input (return Date.now() + x
). The two conditions are independent.
– Mark
1 hour ago
According to me, the function (return Date.now() + x) is a fonction WITH side effect because it reads something from the outside world (the time).
– Joseph M. Dion
1 hour ago
1
1
That is the whole point of the question. The OP is asking why is it necessary to list both when it seems that one is a consequence of the other. However, the examples above show some good counter examples.
– Code-Apprentice
2 hours ago
That is the whole point of the question. The OP is asking why is it necessary to list both when it seems that one is a consequence of the other. However, the examples above show some good counter examples.
– Code-Apprentice
2 hours ago
It's possible to have a function with side effects but always returning the same output for an input (
console.log(x);return x
), and it's possible to have a function with no side effects that returns different values for a given input (return Date.now() + x
). The two conditions are independent.– Mark
1 hour ago
It's possible to have a function with side effects but always returning the same output for an input (
console.log(x);return x
), and it's possible to have a function with no side effects that returns different values for a given input (return Date.now() + x
). The two conditions are independent.– Mark
1 hour ago
According to me, the function (return Date.now() + x) is a fonction WITH side effect because it reads something from the outside world (the time).
– Joseph M. Dion
1 hour ago
According to me, the function (return Date.now() + x) is a fonction WITH side effect because it reads something from the outside world (the time).
– Joseph M. Dion
1 hour ago
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54992302%2fpure-functions-does-no-side-effects-imply-always-same-output-given-same-inp%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown