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 :

Lecture de fichier


Sujet :

Haskell

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Lecture de fichier
    Bonsoir à tous,

    Nouveau en programmation haskell, j'aimerais lire le contenu d'un fichier et récupérer le contenu sous forme de tableau. Le fichier est une liste de nombres séparés par des retours à la ligne.

    voilà mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    readContents :: Handle -> [IO Integer]
    readContents hFile =
      do bIsEOF <- hIsEOF hFile
         if bIsEOF
            then []
            else do line <- hGetLine hFile
                    return(read line):(readContents hFile)
    Mais ghci me renvoie un code d'erreur que j'ai beaucoup de mal à interpréter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Couldn't match expected type `[t]' against inferred type `IO Bool'
        In a 'do' expression: bIsEOF <- hIsEOF hFile
        In the expression:
            do bIsEOF <- hIsEOF hFile
               if bIsEOF then
                   []
               else
                   do line <- hGetLine hFile
    Je ne comprend pas pourquoi cela ne marche pas, j'ai retrouvé beaucoup d'example avec du code très similaire ?

  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
    Citation Envoyé par picachoum Voir le message
    Je ne comprend pas pourquoi cela ne marche pas, j'ai retrouvé beaucoup d'example avec du code très similaire ?
    La clé est dans le "très similaire", mais pas identique. Il y a des erreurs de types dans ton code.

    En restant dans la même idée un code correct serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    readContents :: Handle -> IO [Integer]
    readContents hFile = do
       bIsEOF <- hIsEOF hFile
       if bIsEOF
          then return []
          else do 
             line <- hGetLine hFile
             rest <- readContents hFile
             return ( read line : rest )
    Néanmoins un utilisateur avancé d'Haskell écrirait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    readInts :: Handle -> IO [Integer]
    readInts h = do
       contents <- hGetContents h
       return (map read (lines contents))
    En fait un programmeur vraiment à l'aise en Haskell se passerait sans doute d'une fonction intermédiaire pour faire cette opération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    is <- liftM (map read . lines) $ readFile "filename"
    Ne pas oublier que si tes fichiers sont vraiment gros et que tu as besoins d'excellentes performances en E/S, tu devrais utiliser les ByteString plutôt que les String classiques.

    --
    Jedaï

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonsoir Jedai et merci pour ta réponse.

    tu as transformé le type de ma fonction (tu as remplacé le [IO Integer] en IO [Integer]), c'est pas très grave pour l'exécution de mon programme mais je ne comprend pas pourquoi je ne peux retourner un [IO Integer]?

    De plus, je compte écrire un programme qui va écrire dans le fichier lu. Donc, je ne pense pas pouvoir utiliser la lecture paresseuse (ce qui est le cas hGetContent et readFile)


    picachoum

  4. #4
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Il y a de toute manière la fonction sequence qui permet de passer de [IO Integer] à IO [Integer].

  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
    Citation Envoyé par picachoum Voir le message
    tu as transformé le type de ma fonction (tu as remplacé le [IO Integer] en IO [Integer]), c'est pas très grave pour l'exécution de mon programme mais je ne comprend pas pourquoi je ne peux retourner un [IO Integer]?
    Le type IO [Integer] était très clairement celui que tu souhaitais, c'est à dire une action IO qui lit un handle et produit une liste d'entiers et non [IO Integer], c'est à dire une liste d'actions qui produisent des entiers... Ta version ne retournait pas [IO Integer] et n'aurait pu en pratique retourner [IO Integer] sans lire deux fois le fichier ou connaitre le nombre d'entiers dans le fichier d'avance d'une autre façon.

    Citation Envoyé par picachoum Voir le message
    De plus, je compte écrire un programme qui va écrire dans le fichier lu. Donc, je ne pense pas pouvoir utiliser la lecture paresseuse (ce qui est le cas hGetContent et readFile)
    Je ne vois pas le rapport direct entre écrire dans ce fichier et le lire de façon paresseuse, il me faudrait plus de détails sur ce que tu souhaites faire. Je te signale également que si tu souhaite modifier ce fichier, considère que la façon de faire Unix est de créer un fichier temporaire, y recopier la version modifiée du fichier puis le renommer pour écraser le fichier d'origine. Je te conseille très vivement d'éviter les magouilles en lecture+écriture, quel que soit d'ailleurs le langage de programmation.

    --
    Jedaï

  6. #6
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    merci Jedai

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

Discussions similaires

  1. [Windows]lecture des fichier lnk (raccourcis)
    Par Tiaps dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 21/10/2009, 19h27
  2. [jsp]lecture de fichier
    Par antigone dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/09/2003, 11h05
  3. [AS400][Intranet][PC] Lecture de "fichiers" AS400
    Par lando dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 16/07/2003, 11h11
  4. Lecture de fichier
    Par Watcha dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 04/03/2003, 20h43
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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