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 :

[Haskell] Manipulations de listes


Sujet :

Haskell

  1. #1
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut [Haskell] Manipulations de listes
    Deux questions "simples".

    1. j'aimerais construire couple :: [a] -> [[a]] qui me donnerait toutes les paires [x,y]. Je précise que je démarre depusi hier (ça vous le savez ... ), juste avec la doc.

    La fonction générale pour les sous-tuples est ok:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    combinations :: Int -> [a] -> [[a]]
    combinations 0 _  = [ [] ]
    combinations n xs = [ y:ys | y:xs' <- tails xs
                               , ys <- combinations (n-1) xs']
    Mais est-il possible de la simplifier pour ne tenir compte que de n=2 ? J'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    couple :: [a] -> [[a]]
    couple xs = [y:ys | y:xs' <- tails xs
    			, ys <- tails xs']
    qui bien sûr ne marche pas, et même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    couple :: [a] -> [[a]]
    couple xs = [y:ys | y:xs' <- tails xs
    			, ys <- head.tails xs']
    mais ce head qui me resoudrait le problème ne fonctionne pas!

    2. Une fois la fct couple ok, j'obtiendrai donc une liste [[x1,y1],[x2,y2],...], et étant donné une fonction f:Integer -> Integer -> Integer, j'aimerais l'appliquer à cette liste; c'est avec zipWith, c'est cela?

    Merci pour ceux qui pourront aider un dilletante ...
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  2. #2
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    J'ai regardé dans mes fonctions persos et celle-ci me semble correspondre à ce que tu cherche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # let rec pair_list l =
      match l with
      | []  -> []
      | a::t -> (List.map (fun b -> a,b) t) @ pair_list t;;
    val pair_list : 'a list -> ('a * 'a) list = <fun>
    Remarques:
    • désolé, c'est du Caml
    • désolé, je ne saurais pas faire avec une liste 'en compréhension'
    • j'ai supposé que la fonction à appliquer est commutative, c'est-à-dire que si la liste renvoyée contient le couple (a,b) alors elle ne contient pas le couple (b,a)
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  3. #3
    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
    Alors, pour toutes les parties à deux éléments d'une liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    couple xs = [ [x,y] | x:ys <- tails xs, y <- ys]
    Mais je ne suis pas sûr que tu veuilles vraiment une liste de liste, ne veut tu pas plutôt une liste de tuples ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    couple xs = [ (x,y) | x:ys <- tails xs, y <- ys]
    Par ailleurs zipWith prend deux listes en paramêtre, pas une liste de tuple, il faudrait d'abord utiliser unzip pour pouvoir utiliser zipWith, il serait plus simple de faire un simple map (si j'ai bien compris le but) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    applyToCoupleList f = map (uncurry f)
    (mon nom manque d'imagination...)

    --
    Jedaï

  4. #4
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Merci Jedai. Je pense avoir trouvé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    couple xs = [ (x,y) | x:ys <- tails xs, y <- ys]   
    compa c cc = (foldl (\x y -> x+y) 0 (zipWith (\x y -> if x>y then x-y else y-x) c cc))
    compar = (uncurry compa)
    Ca marche, mais y-a-t'il mieux pour la fct compa?
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  5. #5
    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
    Je ne suis pas très sûr de ce que tu veux dire par "ça marche" vu que je n'ai pas vu d'exemple d'application, mais pour compa, voilà ce que j'aurais écris (principalement des améliorations esthétiques) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compa xs ys = sum $ zipWith (\x y-> abs $ x-y) xs ys
    (Par ailleurs je l'aurais sans doute directement écrit en style non-curryfié, sauf si j'en avais besoin ailleurs bien sûr (mais ça ressemble à un bon candidat pour l'inclusion dans un "where", du moins avec les informations dont je dispose)).

    --
    Jedaï

  6. #6
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    merc pour la rq Jedai. OUi, ça va être utilisé dans un where.

    Ceci dit, je me rends compte qu'ayant commencé "en direct" Haskell, je découvre les fct de base au fur et à mesure! En fait j'utilsie l'index pour chercher des lsites de fct... j'utilise la recherche sur "tails" pour obtenir les fct datalist, etc.

    Il me faudra encore bien du temps avant d'appréhender toute la puissance d'Haskell...
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Tu pourrais utiliser la fonction "recherche par types" de hoogle : l'idée est de demander un type de fonction à hoogle, et il te propose les fonctions qui coresspondent le plus au type demandé.

    C'est assez utile pour la recherche, et très formateur parce que ça oblige à bien penser au type de la fonction que l'on cherche, et que souvent le type, c'est l'essentiel.

  8. #8
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Merci pour l'info Bluestorm, c'est effectivement très utilise. Mais je vais laisser de coté Haskell pour un temps, la charge au boulot remonte fortement
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Le but de l'algorithme est-il bien de calculer la somme des différences en valeurs absolues de toutes les paires d'éléments ?

    Dans ce cas, pourquoi ne pas écrire simplement:
    Code haskell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    compar xs = sum [abs $ x - y | x:ys <- tails xs, y <- ys]
    On peut aussi utiliser cet autre algorithme, basé sur le fait que le calcul est simplifiable si les valeurs sont triées:
    Code haskell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    compar2 xs = sum $ zipWith (*) [n,n+2..] $ sort xs
        where n = 1 - genericLength xs
    La compexité de l'algorithme original est O(n^2) puisqu'il faut générer toutes les paires, alors que la complexité de celui-ci dépend de celle de la fonction sort. Je ne sais pas quel algorithme de tri est implémenté dans le module List mais j'imagine qu'il est O(n*log(n)).

Discussions similaires

  1. Manipulation de listes (moyenne de doublons)
    Par BaBoU_77 dans le forum Prolog
    Réponses: 4
    Dernier message: 06/06/2007, 01h44
  2. probleme manipulation de listes!
    Par galford dans le forum VB 6 et antérieur
    Réponses: 22
    Dernier message: 19/12/2006, 19h50
  3. [VBA-E] Manipuler une liste de Validation
    Par Ptit Dark dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/06/2006, 16h28
  4. Manipuler des listes d'objet ?
    Par xla99 dans le forum Général Python
    Réponses: 4
    Dernier message: 06/06/2006, 15h06
  5. [PDFBox]Comment manipuler une LIST
    Par marcotop dans le forum Documents
    Réponses: 11
    Dernier message: 27/08/2004, 15h46

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