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 :

simplifier mon where


Sujet :

Haskell

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 226
    Par défaut simplifier mon where
    bonjour j'ai le code suivant :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    -- Evaluation des expressions
    evalExp :: EXP -> MEMORY -> TREE
    evalExp (CONST x) memory = x
    evalExp (ID x) memory = getMemory x memory
    evalExp (ADD x y) memory = if letype(xEval)==(Just IntType) && letype(yEval)==(Just IntType) 
                               then TREEVALUE (INT ((getINT xEval) + (getINT yEval)))
                               else TREEVALUE (Error)
            where
                xEval = evalExp x memory
                yEval = evalExp y memory
     
    evalExp (SUB x y) memory = if letype(xEval)==(Just IntType) && letype(yEval)==(Just IntType) 
                               then TREEVALUE (INT ((getINT xEval) - (getINT yEval)))
                               else TREEVALUE (Error)
            where
                xEval = evalExp x memory
                yEval = evalExp y memory
     
    evalExp (MULTI x y) memory = if letype(xEval)==(Just IntType) && letype(yEval)==(Just IntType) 
                                 then TREEVALUE (INT ((getINT xEval) * (getINT yEval)))
                                 else TREEVALUE (Error)
            where
                xEval = evalExp x memory
                yEval = evalExp y memory
     
    evalExp (COMP x y) memory = if letype(xEval)==(Just IntType) && letype(yEval)==(Just IntType) 
                                then TREEVALUE (BOOL ((getINT xEval) < (getINT yEval)))
                                else TREEVALUE (Error)
            where
                xEval = evalExp x memory
                yEval = evalExp y memory
     
    evalExp (NEG x) memory = if letype(xEval)==(Just BoolType) 
                             then TREEVALUE (BOOL (not (getBOOL xEval)))
                             else TREEVALUE(Error)
            where 
                xEval = evalExp x memory
     
    evalExp (AND x y) memory = if letype(xEval)==(Just BoolType) && letype(yEval)==(Just BoolType) 
                                 then TREEVALUE (BOOL ((getBOOL xEval) && (getBOOL yEval)))
                                 else TREEVALUE(Error)
            where
                xEval = evalExp x memory
                yEval = evalExp y memory
     
    evalExp (OR x y) memory = if letype(xEval)==(Just BoolType) && letype(yEval)==(Just BoolType) 
                                then TREEVALUE (BOOL ((getBOOL xEval) || (getBOOL yEval)))
                                else TREEVALUE(Error)
            where
                xEval = evalExp x memory
                yEval = evalExp y memory
    ma question serais comment je pourais remplacer le where ou le simplifier pour eviter de le repeter aussi souvent merci

  2. #2
    Membre expérimenté
    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
    Par défaut
    Ce n’est pas tant le contenu de ton « where » qu’il faut factoriser que le mécanisme complet de vérification et d’évaluation des opérandes. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    evalExp (NEG ex) memory = deepEval memory [ex] [BoolType] $
            \[x] -> BOOL (not (getBOOL x))
     
    evalExp (OR ex ey) memory = deepEval memory [ex, ey] [BoolType, BoolType] $
            \[x, y] -> BOOL (getBOOL x || getBOOL y)
     
    deepEval :: MEMORY -> [EXP] -> [TYPE] -> ([TREE] -> TREE) -> EXP
    deepEval memory operands expectedTypes operator =
            let
                    operandValues = map (flip evalExp memory) operands
                    actualTypes = map letype operandValues
            in if actualTypes == expectedTypes
                    then TREEVALUE (operator operandValues)
                    else TREEVALUE Error
    En remplaçant TREEVALUE (c’est moche d’écrire tout en majuscule, TreeValue serait plus lisible) par un Maybe qui jouerait le même rôle, il serait possible d’améliorer encore tout ça.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 226
    Par défaut
    avec ton code j'ai le message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     Couldn't match expected type `EXP' with actual type `TREE'
        In the return type of a call of `TREEVALUE'
        In the expression: TREEVALUE (operator operandValues)
        In the expression:
          if actualTypes == expectedTypes then
              TREEVALUE (operator operandValues)
          else
              TREEVALUE Error
    pour la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     deepEval :: MEMORY -> [EXP] -> [TYPE] -> ([TREE] -> TREE) -> EXP
     deepEval memory operands expectedTypes operator =
            let
                    operandValues = map (flip evalExp memory) operands
                    actualTypes = map getType operandValues
            in if actualTypes == expectedTypes
                    then TREEVALUE (operator operandValues)
                    else TREEVALUE Error

  4. #4
    Membre expérimenté
    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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    deepEval :: MEMORY -> [EXP] -> [TYPE] -> ([TREE] -> TREE) -> EXP TREE

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 226
    Par défaut
    toujours un problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     Illegal type signature: `MEMORY
                                 -> [EXP]
                                    -> [TYPE]
                                       -> ([TREE] -> TREE)
                                          -> TREE deepEval memory operands expectedTypes operator'
          Perhaps you intended to use -XScopedTypeVariables
        In a pattern type-signature
    pourtant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          type MEMORY = [(IDs,TREE)]

  6. #6
    Membre expérimenté
    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
    Par défaut
    deepEval :: MEMORY -> [EXP] -> [TYPE] -> ([TREE] -> TREE) -> EXP TREE deepEval memory operands expectedTypes operator

    Tu positionnes ton curseur au niveau du smiley et tu appuis sur la touche Entrée (c’est la touche un peu plus grande que les autres avec « Entrée » marquée dessus).

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

Discussions similaires

  1. Simplifier mon code
    Par pierre987321 dans le forum Langage
    Réponses: 5
    Dernier message: 07/04/2010, 12h49
  2. Simplifier mon code "Majuscule/Minuscule"
    Par Manou34 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/01/2008, 17h05
  3. Réponses: 5
    Dernier message: 15/06/2007, 11h58
  4. Comment simplifier mon script ?
    Par MMO95 dans le forum Langage
    Réponses: 7
    Dernier message: 09/01/2007, 00h21
  5. sql ne comprend pas mon where!et me demande des parametres
    Par marie10 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 20/04/2004, 11h08

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