Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Discussion: [Haskell] IO Int

  1. #1
    Membre du Club
    Inscrit en
    mai 2006
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : mai 2006
    Messages : 96
    Points : 43
    Points
    43

    Par défaut [Haskell] IO Int

    Bonjour,

    Je fait un programme qui demande des valeurs a l'utilisateur et effectue des calcul en utilisant d'autres fonctions.

    Je commence à peine a utiliser les entrées-sorties en Haskell, et j'ai besoin d'Int pour les transmettre à mes fonctions.

    J'ai vu dans les tutoriels comment demander un IO Char a l'utilisateur, mais pas d'Int (ou de IO Int).
    Y-a-t-il un type IO Int ou faut-il transformer les IO Char (et si oui comment ? )

    merci.

  2. #2
    Membre chevronné
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2004
    Messages : 679
    Points : 774
    Points
    774

    Par défaut

    La fonction read:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Prelude> :t read
    read :: (Read a) => String -> a
    Prelude> let x = (read "123")::Int
    Prelude> x
    123
    Prelude> :t x
    x :: Int
    Prelude>

  3. #3
    Expert Confirmé Sénior
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    avril 2003
    Messages
    6 173
    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 173
    Points : 8 308
    Points
    8 308

    Par défaut

    Comme le dit GnuVince, read est la solution pour convertir une chaîne de caractère en ce que tu veux, dans ton cas particulier tu peux également utiliser readLn (= liftM read getLine) si tu demandes une seule valeur par ligne, par exemple :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    main = do
      putStrLn "Entrez un entier positif : "
      n <- readLn
      if n < 0
        then do
          putStrLn "J'ai dit POSITIF !"
          main
        else putStrLn ("La factorielle de " ++ show n ++ " est " ++ show (fac n))
    
    fac :: Int -> Int
    fac n = product [2..n]
    Attention read s'appuie sur le contexte pour savoir le type dans lequel il doit traduire la string, ici l'application de fac à n lui montre qu'on veut un entier, mais parfois il est nécessaire de mettre une signature (surtout dans les exemples artificiels... dans les véritables programmes il y a plus de contexte pour aider généralement).

    --
    Jedaï

  4. #4
    Invité régulier
    Profil pro rah asm
    Inscrit en
    décembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Nom : rah asm

    Informations forums :
    Inscription : décembre 2009
    Messages : 7
    Points : 7
    Points
    7

    Par défaut

    Bonjour à tous

    j'ai un petit problème avec les IO en Haskell. j'ai un résultat d'un putStrLn que je veux sauvgarder dans un fichier txt mais j'arrive pas à le faire. voici le code:
    Code :
    1
    2
    3
    4
    5
    6
    main2 = do r <- readFile "GEN.XML" 
               putStrLn ((show . parse) r)
    
    
    save = writeFile "GEN.txt" (main2)
    il affiche que le deuxième argument de writefile doit être un String, j'ai essayé d'utiliser >>= mais ça ne marche toujours pas.
    pourriez vous m'aider pour résoudre ce problème??

  5. #5
    Membre Expert
    Inscrit en
    avril 2007
    Messages
    831
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 831
    Points : 1 130
    Points
    1 130

    Par défaut

    Code :
    main2 >>= writeFile "GEN.txt"
    devrait marcher. Ou alors :
    Code :
    1
    2
    3
    do
      content <- main2
      writeFile "GEN.txt" content
    Le premier code est assez logique si tu connais le type de '>>='.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •