Explanation of partial application - join

Viewed 168

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 ?

3 Answers
Related