【发布时间】:2009-10-28 02:34:44
【问题描述】:
根据the 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
(这些默认定义是我从explanation at Wikipedia 重新键入的,错误是我自己的,但如果有错误,至少原则上是可能的。)
根据当前定义的库,我们有:
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不是用@987654335设计的历史现实的结果@ 和 Applicative 记住了吗?或者它们是否以某种其他行为方式(可能对于某些合法的Monad 定义)与只需要Applicative 上下文的版本不同?
如果它们是不同的,您能否提供一组简单的定义(遵守 Typeclassopedia 和其他地方描述但未由类型系统),liftA 和 liftM 的行为不同?
或者,如果它们不是不同的,您能否使用与前提相同的定律证明它们的等价性?
【问题讨论】:
标签: haskell theory typeclass category-theory