IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Haskell Discussion :

Répéter une action monadique


Sujet :

Haskell

  1. #1
    Membre du Club Avatar de limestrael
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 86
    Points : 57
    Points
    57
    Par défaut Répéter une action monadique
    Je me demandais, quelle est la méthode la plus efficace pour faire une boucle principale se répétant jusqu'à la fin du programme (en gros là où en impératif on aurait un while(continuer) { ... }).
    Genre j'ai une fonction qui doit être répétée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    loop :: IO ()
    loop = do
        drawSomething window x
        drawSomething window y
        handleEvents window
        updateWindow window
        etc.
    Il y a bien 'forever loop', mais là pas moyen d'arrêter le programme sauf en envoyant une exception (beurk).
    On peut aussi imaginer que loop est de type IO Bool (True si on continue, False si on arrête de répéter), ou bien IO (Maybe a) (Just x si on contiue et Nothing si on arrête) et dans ce cas on peut faire une récursion maison pour répéter la fonction en testant sa valeur de retour, mais vu que ce qui je cherche à faire est super commun je trouverai ça bizarre si il n'y a rien de prévu en Haskell pour faire ça et que je me retrouve obligé de faire une récursion.

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    C'est facile à coder par soi-même, et la récursion est une solution simple au problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    stuff = do
      ...
      ...
      when shouldLoop stuff
    Si tu veux vraiment un combinateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    loop :: IO Bool -> IO ()
    loop action = action >>= flip when (loop action)
    Je ne sais pas trop pourquoi ce combinateur n'est pas dans Control.Monad, peut-être parce qu'il paraissait trivial et que la condition d'arrêt ("IO (Maybe a) -> IO a" ou "IO (Maybe a) -> IO ()" ou "IO Bool -> IO ()") n'était pas évidente à choisir ?

    --
    Jedaï

  3. #3
    Membre du Club Avatar de limestrael
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 86
    Points : 57
    Points
    57
    Par défaut
    Oui, c'est très exactement comme cela que j'avais fait.
    Une recursion est effectivement très facile à faire, mais je me demandais juste si cela ne posait pas de problème de pile...

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Non aucun problème de pile, le modèle d'exécution d'Haskell (ou plutôt celui choisi par GHC dans les limites imposées par le Report) est tel que cette pseudo-récursion (action n'est pas une fonction) n'entrainera pas d'accumulation sur la pile.

    --
    Jedaï

  5. #5
    Membre du Club Avatar de limestrael
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 86
    Points : 57
    Points
    57
    Par défaut
    Ok !
    Mais est-ce le cas pour toutes les monades ou bien uniquement pour IO ?

    Par exemple si le code était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    loop :: (Monad m) => m Bool -> m ()
    loop action = action >>= flip when (loop action)
    GHC se rendrait-il aussi compte qu'il n'a rien à accumuler sur la pile ?

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Ce n'est une question de se rendre compte ou pas, c'est une conséquence inévitable du modèle d'évaluation d'Haskell et de la définition de (>>=) et (>>) dans le cas d'IO et a priori de toutes les autres instances de Monad suivant les lois des monades.

    --
    Jedaï

  7. #7
    Membre du Club Avatar de limestrael
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 86
    Points : 57
    Points
    57
    Par défaut
    Ok

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Répéter une action plusieurs fois
    Par Guiggs dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 08/07/2013, 18h25
  2. répéter une action en boucle
    Par Ruyneau dans le forum Tkinter
    Réponses: 9
    Dernier message: 20/03/2012, 09h42
  3. répéter une action
    Par Lubovic dans le forum VB.NET
    Réponses: 10
    Dernier message: 27/01/2009, 19h26
  4. [débutant]Faire appel à une action d'une ActionList
    Par petitours dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/03/2004, 22h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo