
2017-06-29 15:16 GMT+02:00 Francesco Ariis
On Thu, Jun 29, 2017 at 02:33:22PM +0200, Jona Ekenberg wrote:
I want to replace lines with the content of a file if the line is a filename
Hello Jonas, you want to user `return`:
λ> :t return return :: Monad m => a -> m a
which lifts a simple value inside a monad (in this case, a -> IO a), like this:
lineOrIO :: String -> IO String lineOrIO cs | (isPrefixOf "./" cs) = readFile cs | otherwise = return cs
If this is not a school assignment, consider replacing `isPrefixOf "./"` with something from `System.Directory`.
Does this help?
Thank you for your help Francesco! I tried writing it like this:
lineOrIo :: String -> IO String lineOrIo cs | (isPrefixOf "./" cs) = readFile cs | otherwise = return cs
printLines path = do file <- readFile path lines <- map lineOrIo (lines file) print lines
But when evaluating I get this error: PrintComments.lhs:20:14-38: error: … • Couldn't match type ‘[]’ with ‘IO’ Expected type: IO (IO String) Actual type: [IO String] • In a stmt of a 'do' block: lines <- map lineOrIo (lines file) In the expression: do { file <- readFile path; lines <- map lineOrIo (lines file); print lines } In an equation for ‘printLines’: printLines path = do { file <- readFile path; lines <- map lineOrIo (lines file); print lines } Compilation failed. Sadly I am not yet very used to the error messages, so I don't understand what ghci is telling me. As far as I can tell (lines file) should give me an array of strings, which I turn into an array of IO String. Could that be the error? It shouldn't be [IO String] but instead IO [String]? How do I turn the former into the latter? Kind regards, Jona PS. It is not a school assignment, so I'll make sure to check out System.Directory.
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners