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 pour usage des listes


Sujet :

Haskell

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Aide pour usage des listes
    Bonjour,

    Je cherche à parcourir une liste de paires, faire une vérification sur le premier élément de chacune des paires (une égalité), puis d'utiliser la définition de la fonction qui est le 2e élément de la paire pour calculer et retourner une certaine valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    type Var = String
     
     
    -- Expressions du code source en forme ASA.
    data Exp = Enum Int -- Une constante
            | Evar Var -- Une variable
            | Elet Var Exp Exp -- Une expr "let x = e1 in e2"
            | Ecall Exp Exp -- Un appel de fonction
     
     
     
    -- Valeurs renvoyées.
    data Val = Vnum Int -- Un nombre entier
            | Vprim (Val -> Val) -- Une fonction prédéfinie
     
    instance Show Val where
            show (Vnum x) = show x
     
     
     
    type Env = [(Var, Val)]
     
     
    -- L'environnement initial qui contient toutes les primitives.
    pervasive :: Env
     
    pervasive = [("+", Vprim (\(Vnum x) -> Vprim (\(Vnum y) -> Vnum (x + y)))),
                 ("-", Vprim (\(Vnum x) -> Vprim (\(Vnum y) -> Vnum (x - y)))),
                 ("*", Vprim (\(Vnum x) -> Vprim (\(Vnum y) -> Vnum (x * y)))),
                 ("/", Vprim (\(Vnum x) -> Vprim (\(Vnum y) -> Vnum (x `div` y))))]
     
     
    eval :: Env -> Exp -> Val
     
    eval (env1)(Enum x) = (Vnum x)
     
    --eval (env1)(Ecall e1 e2) = case (e1) of
    --                               (Ecall e3 e4) -> ?????
    Donc, en gros, je dois regarder de quel signe est e3, puis utiliser le bon Vprim pour faire la bonne opération avec les valeurs e4 et e2. Cependant je ne sais pas comment faire cette vérification puis cet appel de fonction avec les bons paramètres.

    Voici un exemple d'un Ecall

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Ecall (Ecall (Evar "+") (Evar "x")) (Enum 4))
    Pouvez-vous m'aider ?
    Suis-je au moins sur le bon chemin ?

  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
    Tu n'est pas vraiment sur le bon chemin...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval env (Ecall e1 e2) = case e1 of
    C'est là qu'est l'erreur, tu devrais utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval env (Ecall e1 e2) = case eval env e1 of
    Ensuite tu devrais bien voir que la seule valeur correcte pour le premier membre de Ecall est une expression qui s'évalue en une fonction (Vprim).

    Je te laisse faire pour la suite (par ailleurs ceci est un bon exemple d'utilisation de la monade Reader, même si je doute que vous en soyez là d'après ce que j'ai vu de votre cours jusqu'ici).

    --
    Jedaï

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    hmm
    Je ne comprends pas pourquoi il est nécessaire d'utiliser un appel récursif dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval env (Ecall e1 e2) = case eval env e1 of
    Il me semble que e1 doit nécessairement être un des 4 opérateurs (+-*/), l'appel récursif peut se faire dans la partie suivant le "->" non ?

    Mais bref, ma question principale (quoique merci pour cette erreur) était la manière dont on fait une recherche selon un critère à travers une liste. J'ai essayé la fonction "find", mais sans succès, je reçois une erreur comme quoi le compilateur ne connait pas cette fonction. Je n'ai trouvé aucun exemple de code non plus malgré toute ma recherche sur l'internet

  4. #4
    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
    Citation Envoyé par plouc23 Voir le message
    hmm
    Je ne comprends pas pourquoi il est nécessaire d'utiliser un appel récursif dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval env (Ecall e1 e2) = case eval env e1 of
    Il me semble que e1 doit nécessairement être un des 4 opérateurs (+-*/), l'appel récursif peut se faire dans la partie suivant le "->" non ?
    Si tu ne fais pas un appel récursif, tu vas devoir traiter directement les différents cas... Pour l'instant tu n'as que des fonctions à deux arguments, et uniquement des primitives, mais sous peu tu auras des fonctions à plus ou moins d'arguments et tu auras probablement un moyen de déclarer des fonctions dans ton langage interprété. Utiliser le eval ici simplifie énormément la tâche, tu n'as même pas à te poser de question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    eval env (Ecall e1 e2) = case eval env e1 of
      Vprim f -> f (eval env e2)
      _ -> error "blabla"
    Alors que sinon tu vas devoir mélanger la gestion des applications avec la gestion des variables et de l'environnement.

    Citation Envoyé par plouc23 Voir le message
    Mais bref, ma question principale (quoique merci pour cette erreur) était la manière dont on fait une recherche selon un critère à travers une liste. J'ai essayé la fonction "find", mais sans succès, je reçois une erreur comme quoi le compilateur ne connait pas cette fonction. Je n'ai trouvé aucun exemple de code non plus malgré toute ma recherche sur l'internet
    Haskell dispose d'un excellent moteur de recherche pour ce genre de cas : Hoogle. Tu peux y rechercher un type directement, comme ici "a -> [(a,b)] -> Maybe b" ce qui t'amène directement à lookup qui est la fonction que tu cherches (note que Hoogle utilise un algorithme flou, qui te donne également le bon résultat même si tu lui donnes seulement "[(a,b)] -> a -> b").

    Si tu n'arrivais pas à trouver, tu aurais pu simplement écrire la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lookup _ [] = Nothing
    lookup e ((a,b):rest) = if a == e then Just b else lookup e rest
    --
    Jedaï

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    hmm
    d'accord merci beaucoup pour votre aide =]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 04/01/2006, 23h57
  2. Réponses: 3
    Dernier message: 05/12/2005, 02h30
  3. Besoin d'aide pour utilisation des trie
    Par bluecurve dans le forum Langage
    Réponses: 4
    Dernier message: 29/11/2005, 08h04
  4. [Persistance]Aide pour sauver des données en XML
    Par le Daoud dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 21/06/2005, 13h39
  5. [CR8.5] Aide pour lier des etats
    Par Silvinho42 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 28/04/2005, 10h11

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