2014-03-05 12 views
5

In Haskell, was gibt die Monad Instanz von Funktionen nur Anwendung? Mit Blick auf ihre Implementierungen, scheinen sie fast identisch:Haskell monad vs applicative Instanz von Funktionen

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

Gibt es alles, was Sie mit >>= tun können, die Sie nicht nur mit <*> tun kann?

+1

Ich glaube, dass es keinen Unterschied, im Fall von '((->) ein) 'und' Reader' (was das Gleiche ist), zwischen dem, was die 'Applicative'- und' Monad'-Schnittstellen erlauben. Dies unterscheidet sich von den meisten Typen. – Carl

Antwort

9

Sie sind äquivalent in der Leistung für die Funktionsinstanz: flip f <*> g == g >>= f. Dies gilt jedoch nicht für die meisten Monad-Instanzen.

Es ist ein wenig klarer, wenn wir vergleichen <*> und =<< auf die ((->) r) Instanz spezialisiert (die flip (>>=) ist):

(<*>) :: 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