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 sur un foldl récursif


Sujet :

Haskell

  1. #1
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Aide sur un foldl récursif
    Bonjour

    Pourriez-vous, s'il vous plait, m'expliquer pourquoi ce fold boucle à l'infini et comment résoudre ce problème?
    Je me rends compte que c'est à cause du fait que je le réappelle dans le then, mais je comprends juste pas ce qui cloche.
    De plus, peut-on directement utiliser le acc à la place du v dans le where? Quelles sont les implications?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    myFilter :: [String] -> [String] -> [String]
    myFilter xs acc = foldl op acc xs
                            where op v s = if ( head s == '%' && s == "%")
                                                 then myFilter s'' v
                                                 else v ++ [s]
                                            where (s',s'') = break (=="\n") xs
    Merci beaucoup de prendre le temps de lire mon message et d'y répondre
    Bien à vous, Lochnes

  2. #2
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    Citation Envoyé par Lochnes Voir le message
    Pourriez-vous, s'il vous plait, m'expliquer pourquoi ce fold boucle à l'infini et comment résoudre ce problème?
    Je me rends compte que c'est à cause du fait que je le réappelle dans le then, mais je comprends juste pas ce qui cloche.
    Ta fonction est un brin tordue, mais le noeud du problème semble résider dans le xs final. Il contient la valeur qui était la sienne à l’appel du foldl op acc xs et non le reste du texte à traiter une fois un '%' trouvé. Du coup, à chaque fois que tu rencontres un '%', tu recommences essentiellement l’analyse de tout le texte... à l’infini.

    Citation Envoyé par Lochnes Voir le message
    De plus, peut-on directement utiliser le acc à la place du v dans le where? Quelles sont les implications?
    Oui, mais cette seconde et nouvelle variable masquera (éclipsera) celle du contexte et ce n’est pas forcément conseillé pour la clarté de l’ensemble.

  3. #3
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    merci

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 6
    Points : 7
    Points
    7
    Par défaut But de ce filtre ?
    Salut,

    A la lecture de la signature de cette fonction, il semble qu'elle prend une liste de chaînes, la filtre (saute les chaînes entre "%" inclusivement et "\n" exclusivement) et ajoute cette liste filtrée à une liste donnée, pour produire une liste en sortie. C'est bien cela ?

    Effectivement l'implémentation est très curieuse et on peut craindre qu'une récursivité associée à un foldl ne fera pas l'affaire. Cela ne peut sûrement que créer quelque chose d'assez monstrueux.

    De plus, je ne vois pas l'intérêt de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    head s == '%' && s == "%"
    car le second membre du prédicat doit suffire. D'autre part, je vois que tu renverses la construction naturelle inversée du foldl par Si ce que tu veux faire est bien ce que j'ai écrit au début de la réponse, c'est intéressant car cela nécessite une sorte de fold mais ni foldl ne convient (il bâtit la liste naturellement à l'envers avec cons) et encore moins avec foldr qui traverse la liste dans le mauvais sens.

    Voici un exemple qui fonctionne mais est très inefficace (il emploie ++) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    myFilter xs acc = acc ++ fst (myFilter' xs) where
      myFilter' strs = foldl select ([], True) strs
      select (acc, b) str
       | str == "%"  = (acc, False)
       | str == "\n" = ((acc++[str]), True)
       | b == False  = (acc, b)
       | True        = (acc++[str], True)
    Ici le booléen dans le couple sélectionne et désélectionne l'ajout des chaînes à la liste.

    On pourrait voir à améliorer cela. Mais est-ce que j'ai bien compris ? Sinon, si tu as produit un code qui fonctionne, j'aimerais bien le voir... Merci.

Discussions similaires

  1. Aide sur un algorithme récursif
    Par christianf dans le forum Débuter
    Réponses: 2
    Dernier message: 20/08/2010, 04h35
  2. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19
  3. Réponses: 2
    Dernier message: 27/02/2003, 01h33
  4. [Kylix] Aide sur BitBlt
    Par mic006 dans le forum EDI
    Réponses: 1
    Dernier message: 10/12/2002, 22h54
  5. Aide sur une fenetre
    Par Ray-j dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 29/11/2002, 08h51

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