function to read file and return list of contents not compiling

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

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
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

Thus, return (lines contents) will work. On 19 February 2015 at 22:55, 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
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
-- Regards Sumit Sahrawat

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)
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
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
participants (2)
-
Geoffrey Bays
-
Sumit Sahrawat, Maths & Computing, IIT (BHU)