circular definitions in "Monads as Containers"
We first see
What bind does is to take a container of type (m a) and a function of type (a -> m b). It first maps the function over the container, (which would give an m (m b)) and then applies join to the result to get a container of type (m b).
But then we see
Joining is equivalent to binding a container with the identity map. This is indeed still called join in Haskell:
So then the question becomes: if bind uses join and join uses bind, then we have a serious circularity issue...