Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > Haskell
Haskell Forum d'entraide sur la programmation en langage fonctionnel Haskell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/06/2012, 00h07   #1
josmiley
Membre chevronné
 
Homme
Inscription : avril 2004
Messages : 675
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 675
Points : 728
Points : 728
Par défaut avis ma 1ere fonction: replace

bonjour,

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

Code :
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 :
intercalate "foo" "bar"
et je m'attends à "bfooafoor" mais c'est pas le cas.
"bar" c'est pas comme une liste ?
josmiley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2012, 15h07   #2
Ptival
Membre actif
 
Avatar de Ptival
 
Homme Valentin Robert
Étudiant
Inscription : juin 2004
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Valentin Robert
Âge : 24
Localisation : Etats-Unis

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2004
Messages : 70
Points : 172
Points : 172
Voilà ce que j'aurais écrit pour replace :

Code :
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 :
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.
Ptival est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2012, 23h25   #3
josmiley
Membre chevronné
 
Homme
Inscription : avril 2004
Messages : 675
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 675
Points : 728
Points : 728
ok, je comprends pour intercalate ...

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

Code :
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.
josmiley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2012, 15h03   #4
Yo Eight
Membre confirmé
 
Homme
Ingénieur développement logiciels
Inscription : mai 2009
Messages : 89
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 : 89
Points : 285
Points : 285
Il y a la fonction stripPrefix dans le module Data.List qui est pas mal

Code Haskell :
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
Yo Eight est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 01h11.


 
 
 
 
Partenaires

Hébergement Web