Thanks. I played around some more with return and came up with this which compiles fine:

readData :: String -> IO [String]
readData classNameP = do
    let fileName = classNameP ++ ".txt"
    contents <- readFile fileName
    return $ lines contents

Geoffrey

On Thu, Feb 19, 2015 at 12:25 PM, Sumit Sahrawat, Maths & Computing, IIT (BHU) <sumit.sahrawat.apm13@iitbhu.ac.in> wrote:
The type should be IO [String]. You do IO, and it results in a list of Strings.
Also, take a look at the following types:

    contents :: String
    lines :: String -> [String]

Which means that,

lines contents :: [String]

But because you're dealing with a monad (IO in this case), this will not typecheck. You can convert a pure value to a monadic value using the return function:

    return :: Monad m => a -> m a

Not specific to IO, but all monads.
Hope this helps.

On 19 February 2015 at 22:47, Geoffrey Bays <charioteer7@gmail.com> wrote:
Haskellers:

I want to write a function that takes a class name and reads from a file and then returns the
list of String of the file lines. I have experimented with various return types, but GHC does not like any of them. Here is my function:

readData :: String -> IO String   -- what type here??
readData classNameP = do
    let fileName = classNameP ++ ".txt"
    contents <- readFile fileName
    lines contents

Not to complain, but this would not be difficult in any other language I have tried, so I could use
some explanation. I suspect it has to do with understanding the IO Monad.

Many Thanks

Geoffrey

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners




--
Regards

Sumit Sahrawat

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners