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 :

Encore de ces trucs bizarres...


Sujet :

Haskell

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 13
    Points
    13
    Par défaut Encore de ces trucs bizarres...
    Bon, comme vous voyez il y a bien de ces questions qui reviennent sur ce même sujet que de faire un petit compilateur utilisant Haskell.
    C'est vraiment un cauchemard pour débutant, nos notes de cours ne disent rien et on ne peut pas dire que les tutoriaux se penche sur ce genre d'insanitées

    En voila un autre 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    type Var = String
     
    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)))),
       ("print", Vprim (\(Vnum x) -> Vprim ( imprime x )))]
     
    --imprime :: Int -> (IO Val)
    imprime x = do
       putStrLn ("Vprim "  ++ show x)
       return (Vnum x)
     
    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
             deriving Show
     
    data Val = Vnum Int               -- Un nombre entier
             | Vprim (Val -> IO Val) -- Une fonction predefinie
     
    instance Show Val where
        show (Vnum n) = show n
        show (Vprim f) = "VP"
    -----

    Que je n'arrive pas a compilé, et que mon professeur n'arrive pas a m'expliquer. Croyez moi, 4 courriels et un tour a son bureau et ca rentre toujours pas. J'arrive pas du tout a faire compiler des trucs avec des IO

    Le code normalement fonctionne, le but de l'exercisse était d'ajouter " ("print", Vprim (\(Vnum x) -> Vprim ( imprime x )))]" ... qui d'ailleurs pourrait avoir une erreur dans la déclaration du deuxième Vprim mais le reste devrait etre bon.

    La petite fonction "imprime" ne compile pas du tout... parce qu'elle veut que je retourne un IO j'imagine mais le prof me dit que la fonction peut retourné qqchose d'autre. Aucun sense, je comprend rien : (
    Le prof a dit d'ajouter "return" mais ca ne change rien du tout, ca compile toujours pas et je m'en arrache les cheveux. Help : (

  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
    J'ai l'impression que tu ne comprends pas grand chose à propos des monades, IO en particulier, je me trompe ?

    En tout cas, je pourrais corriger ton code, mais ça ne t'apporterai pas grand chose.

    Quelques remarques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vprim (\(Vnum x) -> Vprim ( imprime x ))
    Qu'est-ce que le deuxième Vprim vient faire là ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vprim(\(Vnum x) -> imprime x)
    serait plus correct.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vprim (\(Vnum x) -> Vprim (\(Vnum y) -> Vnum (x + y)))
    Selon la déclaration de Val, Vprim prend (Val -> IO Val) en paramètre, est-ce que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vprim (\(Vnum y) -> Vnum (x + y))
    est de type IO Val ?

    --
    Jedaï

  3. #3
    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
    A Gentle Introduction to Haskell, version 98: VII. Entrées/Sorties

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data Val =
             | Vnum Int               -- Un nombre entier
             | Vprim (Val -> IO Val)  -- Une fonction predefinie
    Je ne connais rien à Haskell mais à ta place je distinguerais les primitives qui font des IO et celles qui n'en font pas (les types comme Val sont justement faits pour réaliser ce genre de discrimination).

    Ensuite, ne cherches pas de tutoriels sur les monades en général, contente-toi d'observer les types :
    • par exemple putChar est de type Char -> IO ()
    • par conséquent un appel putChar c renvoie IO ()
    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.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par Jedai Voir le message
    J'ai l'impression que tu ne comprends pas grand chose à propos des monades, IO en particulier, je me trompe ?

    En tout cas, je pourrais corriger ton code, mais ça ne t'apporterai pas grand chose.

    Quelques remarques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vprim (\(Vnum x) -> Vprim ( imprime x ))
    Qu'est-ce que le deuxième Vprim vient faire là ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vprim(\(Vnum x) -> imprime x)
    serait plus correct.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vprim (\(Vnum x) -> Vprim (\(Vnum y) -> Vnum (x + y)))
    Selon la déclaration de Val, Vprim prend (Val -> IO Val) en paramètre, est-ce que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vprim (\(Vnum y) -> Vnum (x + y))
    est de type IO Val ?

    --
    Jedaï
    Mmm oui tu as raison pour la première correction.

    Pour la deuxième alors c'est sur que le type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vprim (\(Vnum y) -> Vnum (x + y))
    n'est pas IO Val puisqu'il n'y a aucun IO... . puisqu'il retourne un Vnum de type Int qui est un Val...
    Alors je ne sais pas comment lui dire que le type Vprim peut parfois avoir des IO et parfois pas en avoir..

  5. #5
    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
    L'idée c'est d'ajouter des alternatives à ton type Val.
    Ce code ne passe peut être pas mais tu dois pouvoir t'en inspirer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data Val = Vnum Int                 -- Un nombre entier
             | Vprim (Val -> Val)       -- Une fonction prédéfinie
             | Vprim_in (() -> IO Val)  -- Une fonction prédéfinie pour la lecture
             | Vprim_out (Val -> IO ()) -- Une fonction prédéfinie pour l'écriture
    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.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Ah!
    Oui je crois que ton idée est très bonne.. en faite.. je vais essayer ca.

    Merci!

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

Discussions similaires

  1. petit truc bizarre sur formulaire
    Par laurent00 dans le forum IHM
    Réponses: 1
    Dernier message: 05/12/2007, 12h57
  2. Encore un truc bizarre
    Par LadyArwen dans le forum Requêtes
    Réponses: 13
    Dernier message: 26/10/2007, 08h56
  3. truc bizarre dans une boucle
    Par deubelte dans le forum C++
    Réponses: 10
    Dernier message: 22/01/2007, 12h25
  4. un truc bizarre avec l'évaluateur delphi
    Par isachat666 dans le forum EDI
    Réponses: 1
    Dernier message: 07/04/2006, 14h22
  5. [C#] Truc bizarre avec DataSet
    Par bendj dans le forum ASP.NET
    Réponses: 15
    Dernier message: 13/07/2005, 19h51

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