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 :

Fonction dans un "let"


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 Fonction dans un "let"
    Bonjour,
    j'ai un petit problème dans un travail que j'ai à faire...

    J'essaye de construire un let/in dans lequel le nombre d'affectations locales varie selon la taille d'une liste de paires. Chacune de ces paires, vous l'aurez deviné, représente premièrement la variable et deuxièmement la valeur qu'elle doit prendre dans l'expression.

    Faut-il déclarer une fonction récursive qui fait ce travail à l'intérieur même du let ? Si oui, comment fais-je cela ? Sinon quelle serait la bonne approche à ce problème ?

    Merci en avance !

    p.s.: J'ai essayé de faire dabord le cas d'une seule affectation sans me préoccuper du cas où il y aurait plus d'une paire dans la liste d'affectations, mais Hugs n'aime pas mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    optimize (Lfix list1 e2) =
    	let fst(demo(list1)) = snd(demo(list1))
    	in e2
    la fonction demo retourne bel et bien la première paire de la liste list1 (c'est sûr), j'utilise fst et snd pour prendre chacun des éléments et j'introduis l'égalité, mais je recois une erreur :

    Syntax error in expression (unexpected `(')

  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
    Dans l'expression let pat = expr1 in expr2,
    pat est un motif (pattern), par exemple une nouvelle variable, en aucun cas pat ne peut être une application de la fonction fst.

    Le let ne sert pas à introduire une contrainte d'égalité, il te permet de déclarer une nouvelle valeur.
    let a = b in c ça veut dire 'je défini une nouvelle valeur a, qui vaut b, et que je vais utiliser dans cette expression c'.
    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
    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
    Ok, merci.
    Cependant je n'ai pas encore résolu mon problème.

    J'en suis maintenant avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    opt (Lfix list1 e2) = case (((x,e):xs), opt (Lfix xs e2)) of
    							(((x,e):xs), e2) -> let x = e
    								         	  in e2
    Je pensais pouvoir faire la récursion comme ceci en rapellant la fonction avec la queue de la liste d'affectations à faire, mais je recois une erreur comme quoi la variable xs n'est pas déclarée

  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
    Généralement le besoin que tu décris apparait dans un interpréteur ou autre programme de même eau, dans ce cas on n'utilise pas les let, on utilise simplement la fonction "lookup" sur la liste de variables pour évaluer le constructeur correspondant à une variable dans l'AST de ton langage.

    Si tu ne comprends pas cela, il va falloir nous donner un peu plus de détails pour qu'on puisse t'aider par des exemples.

    --
    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
    Voici un bout de code déjà fourni :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    eval env (Lfix xs e) =
        let lookup [] y = env y
            lookup ((x,e):xs) y = if x == y then eval newenv e else lookup xs y
            newenv = lookup xs
    	in eval newenv e
    Cette autre fonction (d'évaluation d'expressions) fait à peu près ce que j'essaye de faire, mais elle utilise un environnement. Ma tâche est de compléter une fonction "optimize" qui optimise le code avant de l'envoyer à cette fonction d'évaluation avec environnement. L'optimisation en question est :

    (let ((x 3)) ...x...x...) -> (let ((x 3)) ...3...3...) propagation de constantes

    n.b.: il y a une autre optimisation à faire qui enlèvera le code mort, elle va donc enlever le "let (x 3)" pour ne laisser que l'expression avec le remplacement fait, mais bref.

    Pour revenir au code avec la fonction lookup, je dois admettre que je ne le comprends pas bien. Lookup, à ce que j'ai compris de ma recherche sur hoogle, est une fonction qui prend en paramètre un élément quelconque "a" et une liste de paires [(a,b)], elle cherche "a" dans les premiers éléments de toutes les paires et retourne "b" à la première occurence de "a" trouvée. Pouvez-vous m'expliquer comment utiliser lookup pour atteindre mon but svp ?

  6. #6
    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
    Ce code redéfinit localement une nouvelle fonction lookup (entre nous, ce n'est pas une bonne pratique de redéfinir une fonction du Prelude), le paramètre env est une fonction qui renvoie la valeur d'une variable quand on lui donne so nom en paramètre.
    Pour optimize, au lieu de faire direct une évaluation de l'expression correspondante ("eval newenv e"), tu pourrais simplement vérifier s'il s'agit d'une constante (avec un "case e of ...") et remplacer uniquement si c'est le cas.

    Et je n'ai toujours pas assez de détail pour te donner des exemples.

    --
    Jedaï

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/04/2005, 14h22

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