[Haskell-beginners] GHC not buying what I am offering this afternoon

David McBride toad3k at gmail.com
Mon Mar 9 20:37:59 UTC 2015


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 at 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 at 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 at 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 at haskell.org
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>
>>
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>
>>
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20150309/211ab592/attachment.html>


More information about the Beginners mailing list