The 
join function is the conventional monad join operator. It
is used to remove one level of monadic structure, projecting its bound
argument into the outer level.
'
join bss' can be understood as the 
do
expression
do bs <- bss
bs
Examples
A common use of 
join is to run an 
IO computation
returned from an 
STM transaction, since 
STM transactions
can't perform 
IO directly. Recall that
atomically :: STM a -> IO a
is used to run 
STM transactions atomically. So, by specializing
the types of 
atomically and 
join to
atomically :: STM (IO b) -> IO (IO b)
join       :: IO (IO b)  -> IO b
we can compose them as
join . atomically :: STM (IO b) -> IO b
to run an 
STM transaction and the 
IO action it returns.