
Hello You can derive Read:
data Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Ago | Sep | Oct | Nov | Dec deriving (Eq,Enum,Show,Read)
This will certainly throw an error on failure (might not be an error
you would want to transmit to a user though), and it will only read
"Jan" not "jan" or "January"...
Plenty of good suggestions in this thread:
http://www.haskell.org/pipermail/haskell-cafe/2010-January/072177.html
Best wishes
Stephen
On 8 February 2010 21:19,
I want to read a "Month" from input and if this month issn't declared in my data type "Month" I want to throw an error message.
data Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Ago | Sep | Oct | Nov | Dec deriving (Eq,Enum,Show)
-------- Original-Nachricht --------
Datum: Mon, 08 Feb 2010 09:25:13 +1300 Von: "Stephen Blackheath [to Haskell-Beginners]"
An: kane96@gmx.de CC: beginners@haskell.org Betreff: Re: [Haskell-beginners] define action getInt like getLine Hi there,
Data types are required to start with a capital letter, so you'll have to call it MyDatatype. I can't see where readLn is defined. Can you paste a bit more of the code? I don't quite understand how your reading of your own data type is meant to work - normally you would use read or reads from the Read type class.
A more subtle point - because of the way lazy evaluation works, it is generally better to use 'fail' rather than 'error' when in a monad. In some monads it's possible that 'error' may do nothing.
Steve
kane96@gmx.de wrote:
thanks so far. I used "getInt = fmap read getLine", because I think it's enough for me
I have to do it for a more complex case of reading an own data type (myDatatype) with is deriving Show and return an error otherwise. I tried the following which didn't work:
readMyDatatype :: IO myDatatype readMyDatatype = do if readLn == (show readLn) then return readLn else do error "input error"
-------- Original-Nachricht --------
Datum: Tue, 2 Feb 2010 22:39:07 +0100 Von: Daniel Fischer
An: beginners@haskell.org CC: kane96@gmx.de Betreff: Re: [Haskell-beginners] define action getInt like getLine Am Dienstag 02 Februar 2010 22:20:03 schrieb kane96@gmx.de:
Hi, how can I write an action getInt :: IO Int that works like getLine :: IO String but for Int instead of String. I know that I can read the input with getLine and then convert it by using read, but don't know how to write it as an action. I tried getInt :: IO Int getInt read <- getLine but that doesn't work. There are many possibilities.
The shortest is
getInt :: IO Int getInt = readLn
another short and sweet is
getInt :: IO Int getInt = fmap read getLine -- or liftM read getLine
But neither of these deals well with malformed input, if that's a possibility to reckon with, use e.g. the reads function
getInt :: IO Int getInt = do inp <- getLine case reads inp of ((a,tl):_) | all isSpace tl -> return a _ -> handle malformed input
-- GRATIS für alle GMX-Mitglieder: Die maxdome Movie-FLAT! Jetzt freischalten unter http://portal.gmx.net/de/go/maxdome01 _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners