• [^] # Re: Effet de mode

    Posté par (site web personnel) . En réponse au journal Python, langage de l'année pour la seconde année consécutive. Évalué à 3.

    Ultra rapide. Pour toute monade :

    bind a pour type
    bind :: monade a -> (a -> monade b) -> monade b
    C'est a dire que ca prend un objet dans sa monade et une fonction qui sait manipuler l'objet et le mettre dans une boite. Et ca retourne l'objet modifié dans la boite.

    return a pour type
    return :: a -> monade a
    Ca prend un objet, ca le met dans la boite.


    Pour manipuler un objet dans une monade (dans une boite), t'es *obligé* de passer par bind, sinon ca type pas.
    Et c'est tout, en fait...

    Exemple: j'ai une boite avec un nombre, et je veux incrémenter le nombre:

    -- le nombre
    n = 41

    -- le nombre dans sa boite
    nDansUneBoite = return n

    -- la fonction qui incrémente
    incremente x = x+1

    -- incremente nDansUneBoite
    -- ca marche pas ! incrémente ne manipule pas des boites !

    -- faut utiliser bind pour que ca type bien
    -- incrementeDansUneBoite xDansUneBoite = bind xDansUneBoite incremente

    -- zut ! incremente a pas le bon type, ca doit rendre une boite !
    incrementeDansUneBoite xDansUneBoite = bind xDansUneBoite (\x -> return (incremente x))


    Ca y est !
    Tout ce que j'ai fait, c'est faire en sorte que ca type.


    Ici, ma boite est une simple boite, mais on peut en fait *embarquer* plein de calculs dans la boite qui se feront quand la boite sera passée a bind. Par exemple, elle peut garder 2 valeurs et s'utiliser comme buffer (et elle te filera la valeur du tour d'avant), ou alors stocker plein de valeurs (et représenter une liste), etc, etc.

    C'est vraiment une interface, et le code derrière, tu fais ce que tu veux. Mais c'est bien (tm) car *beaucoup* de concepts collent à cette interface, et on peut les combiner...