I've long suspected that one of the things that makes monads notoriously difficult to explain to people outside of the Haskell ecosystem is that very few other languages even have a kind system that you are allowed to manipulate in code (and in some, like C++, it's so esoteric that you basically never see it). First explaining that you can even abstract over "type->type" kinded things gets you a lot of the way towards monads without actually describing monads.

That may be true for functions which operate on a generic Monad typeclass, but typeclasses (Higher kinded types) aren't required to implement concrete Functor / Applicative / Monad instances for a particular type, e.g. Maybe:

    fmap f Nothing = Nothing
    fmap f (Just x) = Just (f x)

    pure x = Just x

    Nothing >>= f = Nothing
    Just x >>= f = f x

> things that makes monads notoriously difficult to explain to people outside of the Haskell ecosystem

Huh, I thought a monad is just a monoid in the category of endofunctors, what's the problem?

And here I was convinced that they’re burritos!

I will say that explaining functors to my coworkers was always much simpler, and then naturally led to monads

Some OO languages have a parallel concept in "Metaclass" (https://en.wikipedia.org/wiki/Metaclass) i.e. the class of a class which is structurally similar to "Kind" though of course the mechanics are quite different.

I still have an old book Putting Metaclasses to Work - A New Dimension in Object-Oriented Programming by Forman et.al somewhere.

There is also the classic The Art of the Metaobject Protocol by Kiczales et.al which is quie relevant here - https://en.wikipedia.org/wiki/The_Art_of_the_Metaobject_Prot...

The key difference is that the Type guys do it at compile time (correctness) while the OO guys do it at runtime (flexibility).

The thing that makes monads difficult is laziness and the anti math circle jerk.

You start from a functor which is a data type that admits a map operation.

Then you add of, or pure, to make an applicative functor, and then you add flatmap to make a monad.

> The thing that makes monads difficult is laziness and the anti math circle jerk.

That's quite a hateful way to describe lack of knowledge.

There are some prerequisites that make it easier to understand monads, and a lot of programmers don't even know those. That can make learning monads difficult right off the bat.

No there's no complexity behind monads except laziness and anti math circle jerk.

It's really basic concepts, much easier than the analysis you do in high school.

But people would rather sit through monad as boxes or burritos cringe tutorials.

Your math explanation starts with a math concept that the vast, vast, vast majority of people will have never even heard of, even in math-adjacent fields. It's not anti-math reasoning. It's a lack of self-awareness that your background is very math heavy, which makes that particular explanation make sense to you. I've gone my entire schooling, as a student who was always one of the few who were "good at math", all the the way through my CS education, without ever having heard of a functor until I came across the Haskell monad explanation meme.

Your next step could be to blame the school systems if you want, but that doesn't help the situation at hand.

I never said anything about complexity, and I certainly never said that I (or anyone) would rather not understand monads. But there are reasons that understanding doesn't just come naturally to people when you try to teach them directly, and it's not because they're just lazy and prefer to remain ignorant, nor that they've simply been brainwashed by the masses. Like, there's no conspiracy to deprive the commons of monads. For instance, it was quite common for my friend group to never stop talking about the utility of monads, lol.

(I say all this as someone who still does not understand monads yet. I don't even have an intuitive understanding of most of the terms you used to explain them. I do know what flat map is, though, from functional programming.)