2015-09-17 2 views
0

Typeclassopedia « s Chapitre 5.3 Notes:Monad plus puissante que Applicative

Intuitivement, il est cette capacité d'utiliser la sortie de précédents calculs pour décider des calculs à exécuter suivant qui rend Monad plus puissant que Applicative .

Cet exemple démontre cette intuition me:

ghci> Just 100 >>= (\x -> if (x == 100) then Nothing else Just x) 
Nothing 

Je ne sais pas (ou attendre à ce qu'il est possible en fonction de l'explication ci-dessus) comment utiliser (<*>) pour obtenir le même, au-dessus du code.

Existe-t-il d'autres exemples plus précis/forts qui illustrent le texte ci-dessus dans Typeclassopedia?

+0

... et voir aussi [exemples de structures de données qui sont à chaque étape du foncteur de chaîne -> applicative -> monad] (http://stackoverflow.com/q/7220436/791604). –

Répondre

3

Pas vraiment un exemple, mais la propriété exacte que vous recherchez est que vous ne pouvez pas écrire join :: Applicative f => f (f a) -> f a mais vous pouvez l'écrire si vous changez la contrainte en Monad. En fait, si vous ajoutez simplement cette fonction à un applicatif, elle devient immédiatement aussi puissante qu'une Monade car avec cela vous pouvez définir return = pure et m >>= f = join (fmap f m).

Je ne me souviens plus de ce que les lois de l'adhésion, mais c'est surtout des choses de bon sens comme join (return (return a)) == return a.

+2

Des trucs de bon sens en effet: 'join. return = id', 'rejoindre. fmap return = id' et 'rejoindre. fmap join = rejoindre. rejoindre – duplode