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 :

avis ma 1ere fonction: replace


Sujet :

Haskell

  1. #1
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    Par défaut avis ma 1ere fonction: replace
    bonjour,

    je débute avec haskell,
    j'ai écrit ma 1ère fonction qui ... fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    replace :: [Char] -> [Char] -> [Char] -> [Char]
    replace str substr substit
        | null str = []
        | null substr = head str : if tail str /= [] then substit ++ replace (tail str) substr substit else []
        | take (length substr) str == substr = substit ++ replace (drop (length substr) str) substr substit
        | otherwise = head str : replace (tail str) substr substit
    c'est l'équivalent de str.replace() en python.

    j'aimerai vos avis ...

    sinon,
    j'essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    intercalate "foo" "bar"
    et je m'attends à "bfooafoor" mais c'est pas le cas.
    "bar" c'est pas comme une liste ?

  2. #2
    Membre actif
    Avatar de Ptival
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 70
    Points : 276
    Points
    276
    Par défaut
    Voilà ce que j'aurais écrit pour replace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    replace :: String -> String -> String -> String
    replace [] _ _          = []
    replace s [] substitute = intercalate substitute (map (\x -> [x]) s)
    replace (c:cs)@s pattern substitute
      | sbegin == pattern   = substitute ++ (replaceRec srest)
      | otherwise           = c : (replaceRec cs)
      where
        replaceRec s = replace s pattern substitute
        (sbegin, srest) = splitAt (length pattern) s
    Ca me semble plus simple à lire que ce que tu écrivais. Notamment, je déconstruis la liste par pattern-matching, plutôt qu'avec des tests comme null str et des appels à head et tail. En général, on n'utilise pas ces fonctions comme tu le fais.

    Quant à intercalate, son type est http://www.haskell.org/hoogle/?hoogle=intercalate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    intercalate :: [a] -> [[a]] -> [a]
    Le deuxième argument doit être une liste d'éléments du type du premier. Aussi, tu dois transformer "bar" en ["b", "a", "r"]. C'est ce que fait le (map (\x -> [x]) s) dans mon code. J'aurais pensé qu'une telle fonction existait, mais je ne l'ai pas trouvée.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    Par défaut
    ok, je comprends pour intercalate ...

    et j'ai appris ce que sont @ et splitAt, bien pratique ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    replace :: [Char] -> [Char] -> [Char] -> [Char]
    replace [] _ _   = []
    replace str@(h:t) substr substit
        | null substr      = h : if t /= [] then substit ++ replace t substr substit else []
        | start  == substr = substit ++ replace end substr substit
        | otherwise        = h : replace t substr substit
        where (start,end)  = splitAt (length substr) str
    merci pour les conseils; j'essaye de faire un pendu, si j'ai d'autre questions je les poserai ici.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Il y a la fonction stripPrefix dans le module Data.List qui est pas mal

    Code Haskell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    replace :: String -> String -> String -> String
    replace _ _ [] = [] 
    replace toBeReplaced substitute s@(x:xs) = 
      case stripPrefix toBeReplaced s of
        Nothing         -> x : replace toBeReplaced substitute xs
        (Just stripped) -> substitute ++ replace toBeReplaced substitute stripped

Discussions similaires

  1. [ODBC] Fonction Replace en ODBC
    Par Alexandre T dans le forum Access
    Réponses: 4
    Dernier message: 10/01/2007, 11h02
  2. Fonction replace
    Par mpat dans le forum ASP
    Réponses: 2
    Dernier message: 30/08/2005, 09h59
  3. Fonction replace
    Par pmboutteau dans le forum ASP
    Réponses: 11
    Dernier message: 10/06/2005, 09h42
  4. PB avec la fonction replace
    Par Techman128 dans le forum C++
    Réponses: 6
    Dernier message: 24/02/2005, 11h39
  5. Fonction replace
    Par PrinceMaster77 dans le forum ASP
    Réponses: 5
    Dernier message: 10/06/2004, 12h18

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