| > Functional-programming evangelists tend to be on the stricter side, though. > I think that a lot of the aversion to functional programming advocacy comes from advocates demonizing anything imperative I find these types to often be more motivated by things like nicely designed grammars and powerful type systems more than functional programming itself. A convenient test is give someone over to a J codebase. If they principally learned in a functional environment, or otherwise mastered functional programming, they'll love it. If they just like having language features that aren't 50 years old, they'll want to tear their hair out. I have seen academic-types that abhor the idea of a flip-flop. I'm not programming a blackboard, so I pay this no mind. > When programming with “functional core with imperative shell”, is that functional programming overall? The functional parts surely are. The imperative parts are probably not (since they have to be very granular). Why reduce it to a binary overall? A complex codebase is a highly entropic thing. How much does the functional core influence the non-functional shell? It probably varies, and would require a high dimensional manifold to accurately graph. > Regarding functional (de)composition and proper structuring, that was very much a thing in imperative programming from fairly early on. Imperative and functional aren't generally mutually exclusive in my eyes. You can use statements to structure programs in a functional manner. No problem. Threaded code is relatively similar to functional programming, but it's also very dead unfortunately. Most people's introduction and exposure to it is exclusively through Forth toys. It was (and maybe still is?) a real assembly technique. You need better control over the callstack than you get out of most imperative languages these days. Point-free style is a critical component of functional programming in my eyes. Far more important than purity. It's not exclusive to functional programming, but it's pretty much holding up half the sky. Without it, you get crap like recursively descending a list of function pointers and void* args. Not ergonomic. I should also note that I would consider ENIAC's programming paradigm to be rather close to functional: https://www.cs.drexel.edu/~bls96/eniac/simulator.html |