I understand pure FP. I can read and write pure FP just fine and I get all the concepts. I know what a Monad is.
I just fucking hate actually writing pure FP programs.
I'll write specific functions or algorithms in pure FP style when it suits the problem at hand naturally (eg, processing data, recursion stuff), and I typically try to make sure that all mutations stay local to functions / don't cross function boundaries, and as much of the codebase as possible, especially the business logic, is side-effect free and referentially transparent (even if it performs mutations on the inside), but those flashy pure FP UI or game frameworks, or pure FP languages... Blech. They're just terrible to use. In trying to achieve purity, they usually have to be extremely abstract in a way that isn't necessary for the problem at hand, just using layers and layers of abstractions to make pure FP even possible, and they also tend to force you to shove the square peg of whatever algorithm you're working on into the round hole of pure FP when not all algorithms naturally map onto pure FP, and imo the key to good comprehensible code is making the shape of your code and its abstractions fit the natural contours of the problem you're trying to solve. Plus, like, some things just *really* don't benefit from pure FP. Doing tail call recursion when you actually just want a fucking for loop, or having your application do tail call recursion (again lol) to update the application state instead of just mutating the state directly, doesn't help at those levels of abstraction. What difference does it really make if the core loop of your application looks like (Python bc its good pseudocode:
state = initial_state()
while (!state.exit):
run_app(state)
versus:
def loop(state):
new_state = run_app(state)
if !new_state.exit:
loop(new_state)
loop(initial_state())
Like how is this meaningfully different? You're still effectively mutating the state, because the same variable name will now refer to a different value, you're just doing it in a ✨fancy✨ way to make you feel special, and now you've got to return descriptions of all state changes from every function and wire them all together and make sure they all flow upstream properly so you've now created infinitely more work for yourself (basically the reverse of React's fucking state management issues).
I could go into a ton of gritty detail with this, and *trust me* I've fucking done my time with pure FP and thinking it was the best thing ever, I know my shit, but it's just... not all its cracked up to be. A little bit of it here and there? Even a lot, to inform your code design decisions? Sure. But like, as a paradigm you have to wrap everything around it isn't ideal. I honestly much prefer struct-oriented and compression-oriented practical procedural programming with lots of FP sprinkled on top.