# Are all deterministic functions free of side-effects (and vice versa)?

I'm reading about pure-functions in functional programming and am wondering, whether a function being deterministic implies that the function is also side-effect free? (and vice versa?)

• i'm guessing by deterministic you mean referentially transparent? but there are at least a couple of other things it could mean (particulalry in FP non-deterministic is sometimes used to mean returns a list of possible outcomes)
– jk.
Commented Mar 15, 2017 at 12:01
• Yes I'm pretty certain referential transparency is what I meant. By deterministic I mean for example `sin()` (always returning the same output when given a particular input), so `sin(90)` can be substituted by 1 Commented Mar 15, 2017 at 12:14

Pure = deterministic + without side effects

A function is pure only, if both criteria are met. If it meets only one of them, it's not pure.

Deterministic but with sideeffects:

As pointed out by @Caleth

``````int DeterministicButSideeffects(int param)
{
Console.Writeline("Sideeffect"); // Side effect here
this.someVariable = param; // Another side effect

return param; // Result only depends on the parameters
}
``````

Without sideeffects but not deterministic

``````int NonDeterministicWithoutSideeffects(int param)
{
return param + getRandomIntNumber(); // Result depends on random number
}
``````

Note that side effects are only "outbound". If a function modifies the state of the containing code (global variable or field in a class) or if it performs some I/O-operations, it has side effects.

Another very simple function that is not deterministic would be:

``````DateTime GetCurrentDateTime()
{
return DateTime.Now; // -> Result depends on current datetime
}
``````

Pure:

``````int add(int num1, int num2)
{
return num1 + num2;
}
``````
• arguably getting a random number does perform a side effect as it either does some IO (get some hardware measurement ) or modifies some global state (internal state of the prng)
– jk.
Commented Mar 15, 2017 at 14:36
• @jk: It could read uninitialized memory which is likely not I/O proper. Even if nothing else changes the contents of the uninitialized memory, the function will return the same result in further invocations, but the result will be unpredictable. It's still a dependence on an external process, that is, the physical process that flips bits of powered-off memory.
– 9000
Commented Mar 15, 2017 at 16:17
• reading uninitialized is a spectacularly bad way to implement a prng. un-initialized memory is not guaranteed to be in anyway random
– jk.
Commented Mar 15, 2017 at 16:21
• @jk correct. depending on the implementation of getRandomIntNumber(), side effects could happen (like changing state of the prng). Commented Mar 15, 2017 at 19:22
• @9000 stackoverflow.com/a/31746063/207716 gives good reasons why you can't write a PRNG by just reading unitialized memory
– jk.
Commented Mar 16, 2017 at 10:59

It's easy to show that a function being deterministic doesn't imply that it is pure, with a simple counterexample:

``````int DeterministicButNotPure(int param)
{
Console.Writeline("Foo invoked"); // Side effect here
return param; // Result only depends on the parameters
}
``````
• Ok, thank you. But All pure functions are deterministic, right? Commented Mar 15, 2017 at 11:08
• This site is about conceptual questions and answers are expected to explain things. Throwing code dumps instead of explanation is like copying code from IDE to whiteboard: it may look familiar and even sometimes be understandable, but it feels weird... just weird. Whiteboard doesn't have compiler
– gnat
Commented Mar 15, 2017 at 11:21
• @gnat this is a conceptual answer: it shows that the implication "function is deterministic" if and only if "function is pure" doesn't hold, by providing a counterexample: a simple function that is deterministic, but isn't pure Commented Mar 15, 2017 at 11:27
• I think this sort of answer is helpful. However, it only answers one question but not if the opposite direction (Purity implies determinism) always holds. Commented Mar 15, 2017 at 11:48
• @netik the definition of a pure function implies that. "A pure function is pure when it is deterministic and doesn't have side effects." Commented Mar 15, 2017 at 14:11