2014-03-05 168 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