Почему работает частичное применение функций с разными сигнатурами?
Возьмите Control.Monad.join
в качестве примера:
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
Почему он принимает id :: a -> a
вместо аргумента (a -> m b)
, поскольку они явно разные?