The exact difference between pure and impure functional programming is a matter of controversy.
Each evaluation strategy which ends on a purely functional program returns the same result.
This style of programming avoids common issues such as race conditions and deadlocks, but has less control than an imperative language.
Persistency is required for functional programming; without it, the same computation could return different results.
Therefore, purely functional data structures can be used in languages which are non-functional, but they may not be the most efficient tool available, especially if persistency is not required.
In general, conversion of an imperative program to a purely functional one also requires ensuring that the formerly-mutable structures are now explicitly returned from functions that update them, a program structure called store-passing style.