2014-03-05 171 views
5

在Haskell中,函数的monad实例给出的仅仅是可应用的?看着他们的实现,他们似乎几乎相同:Haskell monad与函数的应用实例

(<*>) f g x = f x (g x) 
(>>=) f g x = g (f x) x 

有什么你可以用>>=,你不能只用<*>办呢?

+1

我相信没有什么区别,在'((的情况下 - >)一)'和'Reader'(它们是相同的东西),在'Applicative'和'Monad'接口允许的之间。这与大多数类型不同。 – Carl

回答

9

它们在功能实例中的功率相同:flip f <*> g == g >>= f。但对于Monad实例的大多数类型来说这并不是真的。

这是一个更加清楚一点,如果我们比较<*>=<<(这是flip (>>=))专门为((->) r)实例:

(<*>) :: Applicative f => f (a -> b) -> f a -> f b 
    -- Specialized to ((->) r): 
(<*>) :: (r -> a -> b) -> (r -> a) -> r -> b 

(=<<) :: Monad m => (a -> m b) -> m a -> m b 
    -- Specialized to ((->) r): 
(=<<) :: (a -> r -> b) -> (r -> a) -> r -> b