В то время как вы пытаетесь лучше понять Аппликативный, я рассмотрел определение < * > , которое имеет тенденцию быть определено как ap, которое, в свою очередь, определяется как:
ap :: (Monad m) => m (a -> b) -> m a -> m b
ap = liftM2 id
Взгляд на типы сигнатур для liftM2 и id, а именно:
liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
id :: a -> a
Я не понимаю, как просто переходя в id, соответствующая часть сигнатуры типа преобразуется от (a1 -> a2 -> r) -> m a1
в m (a -> b)
. Что мне здесь не хватает?