[Haskell-beginners] define action getInt like getLine

legajid legajid at free.fr
Tue Feb 2 17:06:41 EST 2010


Hi,

here's  another idea :

saisie_choix :: IO Int
saisie_choix=do
    putStrLn "Type in 1 digit :"
    xchoix <- getLine
    if (length xchoix) /= 1 || head xchoix < '0' || head xchoix > '9'
      then saisie_choix
      else do   
        let nchoix=read xchoix::Int
        return nchoix

or, with maybe :

{-      --------------     MAYBE     ------------------ -}

-- Fonction principale
mainmaybe=do
    x <- lire
        if isNothing x
          then do
            putStrLn "Donnee invalide"   
          else do
            putStr " \b" 

    putStrLn ("Resultat : " ++ show (f x))

-- Définition de la fonction de calcul
f Nothing = -9999
f (Just x) = 2 * x

-- Fonction d'IO qui valide la saisie
lire :: IO (Maybe Integer)
lire = do
    -- saisie
    xn <- getLine
    let x=read xn ::Integer
   
    -- validation
    if x < 5
      then do
        return (Just x)
      else do
        return Nothing

Didier.



Rahul Kapoor a écrit :
>> Hi,
>> how can I write an action
>> getInt :: IO Int
>> that works like
>> getLine :: IO String
>>     
>
> The most literal way to write getInt would be:
>
> getInt :: IO Int
> getInt = do
>   s <- getLine
>   return (read s)
>
> which is just a more verbose version of:
>
> getInt' =   read `fmap` getLine
>
> The above versions don't do any error checking, so you might
> prefer a getInt :: IO Maybe Int which returns Nothing in case the input
> is not an integer.
>
> You should read up on Monadic IO in Haskell. The Real World Haskell book
> is probably a good starting point.
>
> Rahul
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>   


More information about the Beginners mailing list