Согласно Typeclassopedia (среди прочих источников), Applicative логически принадлежит между Monad и Pointed (и, следовательно, Functor) в иерархии классов типов, поэтому в идеале у нас было бы что-то подобное, если бы прелюдия Haskell была написана сегодня:
class Functor f where
fmap :: (a -> b) -> f a -> f b
class Functor f => Pointed f where
pure :: a -> f a
class Pointed f => Applicative f where
(<*>) :: f (a -> b) -> f a -> f b
class Applicative m => Monad m where
-- either the traditional bind operation
(>>=) :: (m a) -> (a -> m b) -> m b
-- or the join operation, which together with fmap is enough
join :: m (m a) -> m a
-- or both with mutual default definitions
f >>= x = join ((fmap f) x)
join x = x >>= id
-- with return replaced by the inherited pure
-- ignoring fail for the purposes of discussion
(Если эти определения по умолчанию были повторно введены мной из описания в Википедии, ошибки были моими собственными, но если есть ошибки, по крайней мере, в принципе возможно.)
Поскольку библиотеки в настоящее время определены, мы имеем:
liftA :: (Applicative f) => (a -> b) -> f a -> f b
liftM :: (Monad m) => (a -> b) -> m a -> m b
и
(<*>) :: (Applicative f) => f (a -> b) -> f a -> f b
ap :: (Monad m) => m (a -> b) -> m a -> m b
Обратите внимание на сходство между этими типами в каждой паре.
Мой вопрос: are liftM (в отличие от liftA) и ap (в отличие от <*>), просто результат исторической реальности, что Monad не был разработан с Pointed и Applicative в виду? Или они по каким-то другим поведенческим образом (потенциально, для некоторых легальных определений Monad) отличаются от версий, для которых требуется только контекст Applicative?
Если они различны, можете ли вы предоставить простой набор определений (подчиняясь законам, требуемым для Monad, Applicative, Pointed и Functor определений, описанных в Typeclassopedia и в других местах, но не выполняемых типа), для которых liftA и liftM ведут себя по-другому?
Альтернативно, если они не отличаются друг от друга, можете ли вы доказать их эквивалентность с использованием тех же законов, что и помещения?