在Haskell中,Applicatives被认为比Functor强,这意味着我们可以使用Applicative来定义Functor,如
-- Functor
fmap :: (a -> b) -> f a -> f b
fmap f fa = pure f <*> fa
并且Monad被认为比Applicatives&Functor更强大。
-- Functor
fmap :: (a -> b) -> f a -> f b
fmap f fa = fa >>= return . f
-- Applicative
pure :: a -> f a
pure = return
(<*>) :: f (a -> b) -> f a -> f b
(<*>) = ??? -- Can we define this in terms return & bind? without using "ap"
我读过Monad用于排序动作。但是我觉得Monad唯一能做的就是Join或Flatten,其余功能来自Applicatives。
join :: m (m a) -> m a
-- & where is the sequencing in this part? I don't get it.
如果Monad确实用于排序动作,那么我们怎么定义Applicatives(不被认为严格地按顺序运行,而是某种并行计算)?
因为monad是endofunctors类别中的Monoid。也有可交换的monoid,不一定必须按顺序工作。这意味着可交换Monoid的Monad实例也需要排序吗?
编辑:我发现了一个很棒的页面http://wiki.haskell.org/What_a_Monad_is_not
如果Monad确实用于排序动作,那么我们怎么定义Applicatives(不被认为严格地按顺序运行,而是某种并行计算)?
我们可以复制ap
的定义并对其进行解糖:
():: f(a-> b)-> f a-> f b