Why does partial application of functions with different signatures work?
Take Control.Monad.join
as an example:
GHCi> :t (=<<)
(=<<) :: Monad m => (a -> m b) -> m a -> m b
GHCi> :t id
id :: a -> a
GHCi> :t (=<<) id
(=<<) id :: Monad m => m (m b) -> m b
Why does it accepts id :: a -> a
in place of (a -> m b)
argument, as they are obviously different ?