Объяснение частичного применения -соединение

Почему работает частичное применение функций с разными сигнатурами?

Возьмите 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), поскольку они явно разные?

5
задан Matt Fenwick 13 August 2012 в 16:33
поделиться