I think you are quite close to it. Pure functional programs are called “pure” as they do not modify the state of the allocated memory, they have no “side effects”. Usually, this property is pleasant because it allows the “if it typechecks, it works” philosophy during development. A pure function will always give the same result if called with the same inputs several times.
Side effects can involve reading from / writing to files, modifying global variables, using references, using mutable data structures, etc. It is not always bad to use, but it is often harder to reason about the program when a lot of side effects are present, and some unexpected bugs can occur.
Functional languages can use monads to model the fact that side effects are unpredictable. For example, in Haskell, writing a value of type
X returns a
IO () value, and reading a value of type
X returns a
IO X value. You could think of it as a box labeled
IO telling the user that the value inside might not be reliable, or the operation of checking what’s inside could fail. However, this syntax is quite heavy, and OCaml chose to not use it, because classic (not monadic) functions or just
'a option (which actually is a monad) are easier solutions to use, hence the “industry ready” qualification of this language.
I hope I have made the point even clearer. Note that I am not an expert either !