[Haskell-fr] Fw: Éclaircissements sur les monades

Arnaud Bailly arnaud.oqube at gmail.com
Sun May 18 11:49:13 UTC 2014


computation m = … 

ne peut pas fonctionner puisque computation à la type Reader … donc ne prend pas d’argument: tout est encapsulé dans la fonction runReader.

La magie provient de >>= qui, d’après ta définition, construit un nouveau reader en chaînant et décapsulant la première monade et la continuation (k): on applique la fonction contenue dans Reader  avec (runReader m r), on produit une nouvelle monade en applicant k, on décapsule cette deuxième monade avec le descend appel à runReader. Tout ça est une fonction qui est encapsulée dans un Reader, donc qui devient le champ runReader de Reader. 

Donc pour répondre à tes questions:

Q1: la fonction est un champ de Reader accessible avec runReader :: r -> a, donc tu extraies cette fonction du reader, et ensuite tu peux lui passer un argument.
Q2: cf. le chaînage ci-dessus. Le MyState est passé lors de la première invocation à runReader qui va dérouler la “computation”
Q3: pareil.

Le “principe”de reader et de beaucoup de code monadique est de construire des expressions, qui ne sont évaluées qu’au toplevel, en passant un argument à runXXX pour “démarrer” la chaîne de calcul. IO est un cas particulier qui démarre par l’appel à main. Tu ne peux pas (sauf magie) extraire une valeur de IO, alors que tu peux extraire une valeur (une fonction) depuis un Reader.

HTH

Arnaud
 

On 18 May 2014, at 12:04, Gautier DI FOLCO <gautier.difolco at gmail.com> wrote:

> 2014-03-27 10:11 GMT+01:00 Gautier DI FOLCO <gautier.difolco at gmail.com>:
> 2014-03-27 6:07 GMT+01:00 Dan Popa <popavdan at yahoo.com>:
> 
> Hi,
> 
> Sorry for writing in english, I am not from France.
> Take a look here, please:
> http://www.haskell.org/haskellwiki/Modular_Monadic_Compilers_for_Programming_Languages
> 
> The source  at  #3) on the above page is a code generator written using the State monad.
> The state monad is necessary because here it provides a sort of context, like a set of the global variables
> in imperative programming.
> And that is why we are using The State Monad, to simulate the 
> use of a set of global (or local) variables, used to store values. 
> 
> Especially in this example, the lenghts of the pieces of generated code are stored in order to compute the length of the biggers codes, when they are catenated, (glued together).
> 
> Other monads have specific use. Parser monad is used for glueing parsers, the list monad can simulate paralel computations and even backtracking (there is a backtracking monad too), the Maybe monad is used to make computations including Nothing in the set of values, etc.
> 
> Basically monadic capsules can be seen like Christmas Giftts containing compuations. And monadic operators have two kind of use:
> - return is a package maker, it creates a capsule, a package, like wrapping a gift
> - bind is something like:  how to combine a function with a package. Open the package, compose functions, take care to produce an other package (or capsule).
> 
> Hoping it helps,
> Sincerely yours,
> Dan Popa
> 
> ----- Forwarded Message -----
> From: Gautier DI FOLCO <gautier.difolco at gmail.com>
> To: La liste Haskell Francophone <haskell-fr at haskell.org> 
> Sent: Wednesday, March 26, 2014 12:10 PM
> Subject: [Haskell-fr] Éclaircissements sur les monades
> 
> Bonjour,
> 
> Vaste sujet en perspective : les monades.
> Je pense avoir compris le principe des monades (être en mesure d'effectuer des actions sur une valeur au sein d'un contexte), en revanche il y a deux choses que je ne comprends pas :
>  * La notion de contexte (ou de cadre de calcul) est un peu floue
>  * Pourquoi est-ce que les monades sont aptes à contenir les effets de bords (j'ai lu effectful computations) et pas d'autres typeclass (comme Applicative).
> 
> Merci par avance pour vos réponses.
> 
> _______________________________________________
> Haskell-fr mailing list
> Haskell-fr at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-fr
> 
> 
> 
> _______________________________________________
> Haskell-fr mailing list
> Haskell-fr at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-fr
> 
> 
> State Monads are clearer to me, thanks.
> 
> Bonjour à tous,
> 
> J'ai fais pas mal de progrès ces derniers temps (de manière globale) du coup il y a encore une zone d'ombre que j'aimerais éclaircir : comment les valeurs sont passées à une fonction ?
> 
> La question est vague, un exemple est de rigueur, j'ai ce code que je pense assez classique :
> 
> -- Generic
> 
> newtype Reader r a = Reader { runReader :: r -> a }
> 
> instance Monad (Reader r) where
>   return a = Reader $ \_ -> a
>   m >>= k  = Reader $ \r -> runReader (k (runReader m r)) r
> 
> ask :: Reader a a
> ask = Reader id
> 
> asks :: (r -> a) -> Reader r a
> asks f = Reader f
> 
> local :: (r -> b) -> Reader b a -> Reader r a
> local f m = Reader $ runReader m . f
> 
> -- Specific
> 
> data MyState = MyState
>   { foo :: String
>   , bar :: Int
>   } deriving (Show)
> 
> computation :: Reader MyState (Maybe String)
> computation = do
>   n <- asks bar
>   x <- asks foo
>   if n > 0
>     then return (Just x)
>     else return Nothing
> 
> example1 :: Maybe String
> example1 = runReader computation $ MyState "hello!" 1
> 
> example2 :: Maybe String
> example2 = runReader computation $ MyState "example!" 0
> 
> En gros j'ai deux soucis : comment runReader et asks fonctionnent ?
> 
> Voilà mon raisonnement :
> 
> Ça c'est notre but : runReader (asks bar) (MyState "example!" 0) :: Int
> runReader (asks bar) :: MyState -> Int
> => ok, on attends un MyState pour évaluer le tout
> 
> runReader :: Reader r a -> r -> a
> =>  pas ok : avec un Reader (qui contient une fonction r -> a) on sort cette fonction et on l'applique
> Question 1 : comment on applique cette fonction encapsulée ?
> 
> (asks bar) :: Reader MyState Int
> => pas ok : on attends un MyState pour sortir un Int
> Question 2 : comment ce MyState est "passé" et à quoi pour que ça sorte un Int ?
> 
> Jamais deux sans trois (même si je pense que répondre à la première question répondra mécaniquement aux deux autres).
> Question 3 : Pour computation, comment le Mystate est "passé" aux différents asks ? ou à l'envers, comment les asks savent où et quoi chercher ? (et comment l'appliquer)
> J'ai tenté le code suivant, sans succès :
> computation :: Reader MyState (Maybe String)
> computation m = do
>   n <- asks bar m
>   x <- asks foo m
>   if n > 0
>     then return (Just x)
>     else return Nothing
> 
> Merci par avance pour vos réponses et votre patience.
> _______________________________________________
> Haskell-fr mailing list
> Haskell-fr at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-fr

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-fr/attachments/20140518/26200802/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 496 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://www.haskell.org/pipermail/haskell-fr/attachments/20140518/26200802/attachment-0001.sig>


More information about the Haskell-fr mailing list