Considering the expression:
[0,1..] >>= \i -> [i * 2]
In the definition of >>= for List, the lambda function \i -> [i * 2] is mapped over the list argument via fmap, resulting in a list of lists, [[0], [2]..]. So >>= needs to flatten the result using a join function in order to return the list: [0, 2..]
According to this source: "...the definition of bind in terms of fmap and join works for every monad m: ma >>= k = join $ fmap k ma"
So why is it necessary to place the burden of returning a monad on the function supplied to >>=? Why not simply define bind like so?
ma >>= k = fmap k ma
This way you don't have to deal with flattening the result.