根据该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
注意这些类型的每对之间的相似性。
我的问题是: liftM
(从不同liftA
)和ap
(从不同的<*>
只需将历史现实的结果Monad
被设计没有Pointed
和Applicative
的心灵? 或者,他们在其他一些行为方式(可能,对于一些法律Monad
定义)从只需要一个版本不同的Applicative
方面?
如果它们是不同的,你可以提供一组简单的定义(服从所需要的法律Monad
, Applicative
, Pointed
,和Functor
在Typeclassopedia描述定义和其他地方而不是由类型系统执行)针对liftA
和liftM
不同的表现?
或者,如果他们不是明显的,你能使用这些同样的法律作为场地证明自己的等价?