Why is (=<<) id = join in Haskell?

haskell

Solution

`m a' -> m a'` is also a kind of `a -> a`, so we can have

      id ::  m a' -> m a'                        -- a = m a'
   (=<<) :: (m a' -> m a') -> m (m a') -> m a'   -- a = m a', b = a'

(=<<) id ::                   m (m a') -> m a'

Problem

``` (=<<) :: (a -> m b) -> m a -> m b id :: a -> a join :: m (m a) -> m a ``` So shouldn't, ``` (=<<) id ``` give an error because, ``` id :: a -> a ``` and not, ``` id :: a -> m a ``` Doesn't (=<<) expect, ``` (something -> m anything) ``` as its first argument?

Original source