I've always felt like RPN is a really powerful lesson in how subtly redefining the semantics of a problem can make it suddenly much easier to solve.
My personal struggle with functional programming is how difficult I find it to be iterative. I've very frequently backed myself into a corner and ended up having to rewrite everything, whereas in C, even when I miss badly on the architecture, I'm still usually able to reuse some big chunks of what I've already done in the end. Maybe it's just inexperience.
I think a lot of people encounter this difficulty when they first get into functional programming, but over time it inverts, where you end up building all these small self contained pure functions that are easy to re-use and recombine and it's only the exoskeleton of the program that suffers from this stuff, so you end up spending a little more time on stuff like effect systems or whatever get it to a state where you can do things like use logging wherever you want without rewriting all your code. Once you cross the chasm the impedance mismatch reverses and you're stuck with the bad feeling in all other code.