Here, I knew this was coming from the beginning. Well, I see where you come from, and I’m quite familiar with FP, just enough to say comfortably that the two paradigms are different, and perfectly alright when used correctly. I have been a C++ programmer for a very long time, and I learned the hard way that if you are running into any of those pitfalls you mention in your piece, you are doing something wrong. Take using Java, for example: I hate it, but not for the reasons many might imagine. Java’s approach is more like “the world is full of clueless monkeys, let’s make sure they can’t possibly do anything wrong by simply preventing them from doing anything useful, or OO” than like “oh, you want to solve this problem in this way, here you go, but be warned that that’s not the right way of solving it, and if you persevere, you are going to have troubles along the way”. Take the Diamond thing, C++ suffers from that, and the right way of addressing the issue is not to prevent multiple inheritance, but to take a step back and re-evaluate your design so that the issue goes away. Multiple inheritance, as a matter of fact, saved my bottom more times than I care to remember, and I’ve had my fair share of encounters with the Dreadful Diamond.
I’m not going to respond item by item, I’m just going to say that you sound like any of the many frustrated programmers — even long-time, very experienced programmers—who probably don’t have time, will, or resources to take steps back and evaluate the situation. I get that, I’ve been like that for a long while, so I understand. When I dipped into FP I too felt refreshingly relieved, but I also soon realised that the two paradigms just serve different purposes, they are good for different things, and one can not necessarily do all that the other can do, at least not as efficiently and/or effectively. If FP suits your needs better, then so be it, but please, don’t just bash the other camp because you’ve become frustrated with it.