The greatest apparent threat that causes us to program functionally is the fact that Object Oriented Programming has failed to address mutability in states that results because of most objective implementations. I am no FP guru but I think a number of difficulties that FP overcome are because if intermediaries. OO fails to address intermediate states that objects tend to take. When an object is in the process of changing state, what really is changing is the composite part of the object and not really the abstraction itself. If these objects were not composite and were really supported by the type system of the language (thereby making them inherently a part of it), the intermediary states could probably have been avoided #staging-the-obvious
It is interesting to think of how human beings actually avoid such intermediate states while exchanging ideas/arguing. Think about this (not so) hypothetical situation:
Person1: I want no hierarchy in the organisation that I am working in!
Person2: Eh? Every decision that you take, you are picking one choice over another. You are establishing hierarchy right there
Person 3: (Boing! But I still want to work in a place with no hierarchy)
How do we manage to keep minds stable and keep belief systems from toppling over in such conversations. Is it because we have managed to keep our thoughts completely decoupled from each other? Or is it because we have really made sure our belief system is simply just protected from rationality(selectively).
Why is this really something that cannot be done with code? Selectively have a purely functional/rational part? And then another part that is state based? Every (commercially) successful functional programming language (Clojure say) has a story to say about a functional part and a non-functional state based part. It all maps together beautifully if you ask me.