Formally, everything has to be effect free; furthermore, everything has to be strict (the potential for any value to be "bottom" breaks things).
You can apply the same intuition and things mostly work, but there can be a few surprises.
These theorems are a huge part of the "if it compiles it must be correct" feeling that functional programming often provides.