There is a difference between IO [()] and IO () and [IO ()]

A type of [IO ()] is a list of actions, none of which have actually been executed.
A type of IO [()] is a single action that has executed and returned a bunch of nils.

sequence is one way to combine a list of actions into a single action that returns a list of their results, but it might be better to try and separate the pure and impure part of that line of code:

mapM putStrLn $ ([show s | s <- [1,2,3]] :: [String]) :: IO [()]

The type annotations are for explanation only.  Then use mapM_ if you do not want to save these nils for some reason (there are performance implications).


On Mon, Mar 9, 2015 at 4:25 PM, Geoffrey Bays <charioteer7@gmail.com> wrote:
Thanks, Joel.

Putting the type IO [()] in the main declaration and this as the final line of the main function does do the trick:

sequence [putStrLn $ show s | s <- newList]

But this is the kind of thing that makes Haskell types difficult for beginners to work with...

Geoffrey

On Mon, Mar 9, 2015 at 4:15 PM, Joel Williamson <joel.s.williamson@gmail.com> wrote:

main must have type IO a. Hoogle tells me that to convert [IO a] -> IO [a], you should use the function sequence. Try applying that to your final line.


On Mon, 9 Mar 2015 16:07 Geoffrey Bays <charioteer7@gmail.com> wrote:
My main function looks like this:

main :: [IO()]
main = do
    let stud1 = Student {name = "Geoff", average = -99.0, grades = [66,77,88]}
    let stud2 = Student {name = "Doug", average = -99.0, grades = [77,88,99]}
    let stud3 = Student {name = "Ron", average = -99.0, grades = [55,66,77]}
    let studList = [stud1,stud2]
    let newList = calcAvg studList
    [putStrLn $ show s | s <- newList]
    --putStrLn $ show (newList !! 0)
    --putStrLn $ show (newList !! 1)

With this final line, putStrLn $ show (newList !! 0), the type IO () in the function declaration compiles fine.
But with [putStrLn $ show s | s <- newList] as the final line, [IO ()] in the function declaration will not compile, I get this error:

    Couldn't match expected type `IO t0' with actual type `[IO ()]'

What does the declared type need to be for a final line of:
[putStrLn $ show s | s <- newList]  ???

Thanks,

Geoffrey

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

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



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