emit as I described, is a made up term. I borrowed it from CouchDB because I do find it far more expressive. join was also made-up when monads were adapted to Haskell, as a term to remove an abstraction layer. This is why I mention about expressivity in the article, to someone unfamiliar the term join (and Haskell, etc) doesn't make a lot of sense and it's just another weird thing to learn that I feel could be made easier. In my opinion as long as the functionality of a join exists, the name doesn't matter. But I do know others do not share that opinion and that is fine.
When I do write a monad I always make sure that join is there, and emit is just added as an alias. Same with map and fmap and so on. I always make sure the Monad Laws pass (I didn't even mention those here because that would be a whole other explanation). But for an "introduction" that can get someone doing something that is so different and almost counter to how JS works, I think a lot of the historical names and advanced conventions can be postponed for another day.
I have no problems with the names you have chosen.
When I say emit is not the same as join, what I mean is that emit (as you have defined it) is not equivalent to join (as Haskell defines it — if you wish to use that as a point of reference).
Emit is in fact equivalent to extract, which is part of Comonad but not part of Monad. There is no way to do what emit does with a Monad.
You can define join from Monad, or join can be used in the definition of Monad — there are different equivalent ways to formulate Monad.
This is not a naming problem. This is a problem with the definition of Monad.
It's done in Professor Frisby's guide here and in his videos:
And in the Composing Software book (this is a part of it):
(He also points out rightly that one can just omit join altogether and use a chained identity for this kind of thing. That might actually be easier from an educational perspective, I'm not sure.)
As does the monet.js monad library which aliases join to be like .chain(a => a) which might as well be () => x in the end, it's just a semantic difference.
.chain(a => a)
() => x
And this last one on Maybe by James Sinclair is another, just using a class-style monad.
For Monad to make sense, types cannot be ignored. That is why join is being misunderstood.
I have not watched Professor Frisby's explanation so I have no comment there.
Eric Elliot misunderstands join in his article you linked. I'll try and get in touch.
monet.js does it right. Read carefully what the type of join is.
James Sinclair describes join accurately and then, following that, explains why emit cannot be defined for Maybe. I recommend rereading his work carefully.
We're a place where coders share, stay up-to-date and grow their careers.
We strive for transparency and don't collect excess data.