Okay, for one:<p>1. Dynamically Typed Languages (LISP, Erlang, Smalltalk, Python, Ruby, and Javascript) are all easier than Haskell, JAVA, C++ or any other typed language for working with ADTs. Whether the language is OO or not isn't really relevant. On the other hand, you loose type-safety/efficient representations. But life is filled with choices, different tools are good for different things at different times.<p>2. You can have closures in a class based language. Here's some rather exotic Python code that uses both for measuring the performance of iterators: <a href="https://github.com/wearpants/measure_it/blob/master/measure_it/__init__.py" rel="nofollow">https://github.com/wearpants/measure_it/blob/master/measure_...</a><p>Smalltalk and Scala also have closures. It's not an either/or for classes vs. closures in programming language land.<p>3. There's more to concurrency than shared memory, so immutability is again a weapon that is good for some battles. If you have an app which you've factored into workers, unless they are on the same machine they'll need to communicate. Having your data be serializable is more important than having things be immutable in this context. What a worker does with data while it is handling it can involve lots of mutation.<p>So everyone should take a big breath, and remember that there's no one way to think about software and there's no universal rules, other than probably P != NP and stuff like that.