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 :

Aide avec replicateM


Sujet :

Haskell

  1. #1
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut Aide avec replicateM
    J'ai vu le bout de code suivant sur le channel #haskell sur Freenode, et je comprends pas comment il fonctionne. J'aimerais bien que quelqu'un puisse m'aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Control.Monad> replicateM 4 "01"
    ["0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"]
    Selon la documentation, replicateM exécute l'action ("01") n fois (4 fois dans mon cas.) Je comprends le fonctionnement de la fonction replicate, mais ceci dépasse mon niveau.

    Merci.

  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
    Comme le M dans son nom l'indique, replicateM travaille dans une monade. La première chose à faire est donc de déterminer dans quel monade "replicateM 4 ['0','1']" travaille (j'ai réécris "01" en ['0','1'] pour que la suite soit plus claire).

    Le type de replicateM est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    replicateM :: (Monad m) => Int -> m a -> m [a]
    Donc "replicateM 4 ['0','1']" travaille dans la monade [] (Liste), comme le type de son second argument l'indique. La monade liste peut être vue comme "non-déterministe", chaque valeur dans la monade liste peut être vue comme une superposition de valeur possible, et une action de la monade liste renvoie la liste des valeurs résultats possibles, un exemple simple est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    superProduit xs ys = do
      x <- xs
      y <- ys
      return (x*y)
    superProduit [2,3] [4,5] renvoie [8,10,12,15], la liste des produits possibles entre des éléments de la première et la deuxième liste.
    La monade liste est également celle qui sert pour les compréhension de listes.

    Ce que fait replicateM est relativement simple : "replicateM n a" est une action monadique qui répète n fois l'action a et renvoie la liste des résultats.
    Un exemple simple d'utilisation est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    main = do
      putStrLn "Entrez trois nombres (pressez Entrée après chaque) :"
      ns <- replicateM 3 readLn
      print (sum ns)
    Dans ce cas, on travaille dans la monade IO.

    Revenons à "replicateM 4 ['0','1']", on voit donc que cette action "choisit" 4 fois entre 0 ou 1 et nous renvoie la liste des résultat, pour chaque combinaison de 4 choix possibles. Autrement dit, elle nous renvoie l'ensemble des chaînes de 4 caractères parmi 0 ou 1.
    On pourrait aussi l'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[w,x,y,z] | w <- "01", x <- "01", y <- "01", z w <- "01"]
    NB : Il est facile d'écrire replicateM soi-même, soit par une récursion explicite (et laide) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    replicateM n a 
      | n > 0 = do x <- a; xs <- replicateM (n-1) a; return (x:xs)
      | otherwise = return []
    soit plus élégamment avec le séquenceur monadique de base (sequence) et la fonction replicate sur les listes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    replicateM n a = sequence (replicate n a)
    --
    Jedaï

Discussions similaires

  1. Besoin d'aide avec Regexp::Assemble
    Par mobscene dans le forum Modules
    Réponses: 5
    Dernier message: 11/04/2007, 12h39
  2. [ASA] J'ai besoin d'aide avec sybase et vb6 svp !!
    Par tibo830 dans le forum SQL Anywhere
    Réponses: 7
    Dernier message: 12/05/2006, 10h09
  3. Besoin d'aide avec TinyXML
    Par Clad3 dans le forum Bibliothèques
    Réponses: 5
    Dernier message: 15/08/2005, 18h20
  4. Réponses: 2
    Dernier message: 29/08/2003, 17h52
  5. Besoin d'aide avec postgresql sous windows NT
    Par Chihuahua dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 18/07/2003, 08h29

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