- Safe multithreading! Immutable data structures are not subject to data race conditions, and consequently don't have to be protected by locks
- The ability to have your cake and eat it: imagine you have a complex OO system processing messages - every component might make state changes depending on the message and then forward the message to some objects it has links to. Wouldn't it be just too cool to be able to easily rollback every change if some object deep in the call hierarchy decided the message is flawed? How about having a history of different states?
- Many housekeeping tasks made for you: deconstructing data structures (PatternMatching), storing variable bindings (lexical scope with closures), strong typing (TypeInference), garbage collection, storage allocation, whether to use boxed (pointer-to-value) or unboxed (value directly) representation...
Some Advantages of Functional Programming
More... (ML/OCaml specific)