Значит так:
Prelude Data.Functor.Constant Control.Applicative> :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
Старая добрая всем хорошо известная функция
Дальше:
Prelude Data.Functor.Constant Control.Applicative> Constant "Hello " <*> Constant "world!"
Constant "Hello world!"
Всё хорошо, но почему выражение Constant "Hello " <*> Constant "world!"
прошло проверку типов, при том, что <*>
ждёт первым аргументом f (a -> b)
а реально передан Constant "Hello "
, т. е. f a
?