All notations have trade-offs at the level of semantics making certain operations more difficult to express (what programmers refer to as 'the expression problem')
That's the entire shpiel of reification/first-class citizenships/semantics of programming languages.
Instead of getting into fanboi-ism of 'my language is better than your language' perhaps approach the problem from first principles (design): what is "IT" that you want to talk about, reason, express and manipulate in your program?
That dictates the sort of language you need to solve the problem that you are trying to solve.
https://en.wikipedia.org/wiki/First-class_citizen https://en.wikipedia.org/wiki/Reification_(computer_science)
You wind up with two camps that cannot communicate. It's often made worse by the functional programmers - who are mostly also imperative programmers - doing a poor job of enabling translation.
This is also what rubs me the wrong way about the simplistic level with which FP languages (like Haskell or Scala+monads) are either cargo culted or hated. The truth is, the two perspectives really go hand-in-hand, and we're all the worse for not realizing this.