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

Gautier DI FOLCO gautier.difolco at gmail.com
Sat May 24 18:03:16 UTC 2014


Le 18 mai 2014 15:27, Arnaud Bailly <arnaud.oqube at gmail.com> a écrit :

> Je plussoie sur le cours NICTA que j’ai découvert récemment.
>
> Tony Morris est un génie, dommage que ce soit aussi un connard.
>
> On 18 May 2014, at 15:20, Gautier DI FOLCO <gautier.difolco at gmail.com>
> wrote:
>
> Le 18 mai 2014 14:36, Simon Marechal <simon at banquise.net> a écrit :
>
>> On 05/18/2014 12:04 PM, Gautier DI FOLCO wrote:
>> > Merci par avance pour vos réponses et votre patience.
>>
>> A mon avis, le plus efficace pour vraiment comprendre ce qu'il se passe,
>> c'est de désucrer le code à la main. Pour moi le truc qui m'a vraiment
>> permis d'avancer ça a été d'écrire "State" et "Maybe" moi même, juste en
>> suivant les types, puis de faire "StateT" et "MaybeT".
>>
>> Il y a ce "cours", qui est en fait une succession d'exercices, qui je
>> pense est excellent :
>>
>> https://github.com/NICTA/course
>>
>
> ça a l'air génial ce dépôt, merci.
> _______________________________________________
> 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
>
>
Je suis de retour...

Je suis sur le cours de NICTA et je suis sur la définition de l'instance
Apply de State.
Voilà à quoi j'arrive :
State f <*> State g = State $ \x -> let (a, b) = g x in let (c, d) = f b in
(c a, d)

Ce qui n'est pas très éloigné de la solution (
https://github.com/tonymorris/course/blob/master/src/Course/State.hs#L45) :

instance Apply (State s) where
  State f <*> State a =
    State (\s -> let (g, t) = f s
                     (z, u) = a t
                 in (g z, u))

Si je les met côte à côte :
State f <*> State g = State $ \x -> let (a, b) = g x in let (c, d) = f b in
(c a, d)
State f <*> State g = State $ \x -> let (c, d) = f x in let (a, b) = g d in
(c a, b)

Et là, je suis troublé...
J'inverse l'évaluation de f et de g et ça continue de fonctionner (selon
les tests et 2-3 cas fait à la main).

J'ai trois questions :
1. Est-ce que j'ai bon ?
2. Si oui, pourquoi en général on fait plus comme la solution ?
3. Si oui (1), pourquoi est-ce que les deux sont équivalents ?

Merci par avance.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-fr/attachments/20140524/67a01cf8/attachment.html>


More information about the Haskell-fr mailing list