> The simple version is that higher order functions do not correspond to anything that is part of our common sense thinking.
and what is common sense thinking here? are you talking about python or just programming in general?
> Functional code can easily be a joy to write but a confusing nightmare to debug. And we spent more time on debugging than writing
Citations needed. I'm not sure who WE is in this context. Python is an imperative lang and doesn't even do OO that well, let alone FP. but, if you are talking about programming in general, I do find it to be much easier to hunt down bugs in languages where the design philosophy of the language favors functional programing ergonomics.
There's even been studies on this.
https://cacm.acm.org/magazines/2017/10/221326-a-large-scale-...
tl;dr: "For those with positive coefficients we can expect that the language is associated with a greater number of defect fixes. These languages include C, C++, Objective-C, Php, and Python. The languages Clojure, Haskell, Ruby, and Scala, all have negative coefficients implying that these languages are less likely than average to result in defect fixing commits."
> As a result people have created arbitrary terminology for it like "lambda" and "reduce".
But Python does exactly that (I'm not knocking it, terminology is important, but its all arbitrary)
In Python, we have "for" loops, we have "while" loops for lists and tuples(+ special syntax for "for" loops, when looping over a list of tuples!).
Any sufficient digging into "for loops" and their implementation, and we begin to realize it's all just iterators under the hood completely hidden from the developer, but I digress.
We have a special syntax for list comprehensions, (special syntax for nested comprehensions) that extend to ranges. There's special syntax in the form of specific statements that exist only in the context of a loop; "continue", "break", "pass", etc.
There's all the implicit state passing into the bodies of these loops, and there's no referential transparency.
"map", "reduce", and "filter" are specific and have no special constructs, no magic, it does what it says on the box. I'd argue it has a very similar mental overhead to a for loop.
This is my experience, YMMV.