Я очень плохо соображаю, когда мне доносят определения в бытовых терминах "Вот это вот тут есть, и еще вот тут шняга такая, крч вот монада". Формальные определения лучше подходят
Пусть есть некоторое M[_], pure, flatMap, такие что pure(a).flatMap(f) = f(a), fa.flatMap(_.pure) = fa и mf.flatMap(f).flatMap(g) = mf.flatmap{x => f(x).flatmap(g)}