Согласно 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
ведут себя по-другому?
Альтернативно, если они не отличаются друг от друга, можете ли вы доказать их эквивалентность с использованием тех же законов, что и помещения?