8

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

2
  • 1
    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
    – user66875
    Commented Mar 15, 2017 at 12:14

2 Answers 2

20

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;
}
8
  • 4
    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
  • 1
    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
4

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
}
5
  • Ok, thank you. But All pure functions are deterministic, right?
    – user66875
    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
  • 4
    @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
    – Caleth
    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.
    – netik
    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."
    – Pieter B
    Commented Mar 15, 2017 at 14:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.