Yep, I didn’t want to go into CT because as you said, it’s really abstract and it can lead to a lot of confusion. In fact, even if I understand the basic concepts of CT, I don’t feel comfortable (or adequate) explaining it. All I wanted to point out is that Monoid is one of the building blocks of composition (or perhaps vice versa), and see that a Monad in FP lets us compose a different kind of functions, and even if the functions don’t have the same type, you can also compose them even if they don’t form a proper monoid. I get why some people could get upset by seeing monoids used this way (instead of thinking about the category of endofunctors), but it’s the same for a lot of books/videos/lessons made by professional programmers which are fine for other programmers but quite inaccurate if we think about maths. Even calling a Functor a “container” doesn’t make much sense, but in programming it can be represented by a container. I’m sure that if you read the transcript of the Kyle Simpson workshop “Functional-Light JavaScript V3" for example, you’d find some weird statements which don’t make sense in maths. It’s just easier to reason about, and it’s honestly quite challenging as it is! All a FP programmer wants to do is composing functions, and if one is really passionate about it (just like you seem) than he may go into more detail. : )
Thanks!