[Haskell-cafe] Why is Haskell flagging this?

Thomas Davie tom.davie at gmail.com
Sat Dec 18 20:38:13 CET 2010


On 17 Dec 2010, at 21:44, Christopher Done wrote:

> On 17 December 2010 18:04, michael rice <nowgate at yahoo.com> wrote:
> ===================
> 
> f :: [Int] -> IO [Int]
> f lst = do return lst
> 
> main = do let lst = f [1,2,3,4,5]
>           fmap (+1) lst
>  
> The problem is that you are applying fmap to a type IO a.
> 
> fmap (+1) (return [1,2,3])
> 
> But to achieve the behaviour you expect, you need another fmap:
> 
> fmap (fmap (+1)) (return [1,2,3])

Which can be more neatly written with Conal's semantic editor cominators as

(fmap . fmap) (+1) (return [1,2,3])

Of course, I question why the list is put in the IO monad at all here... surely this would be much better

return $ fmap (+1) [1,2,3]

Finally, that has the wrong type for main... perhaps you meant to print it out?

main :: IO ()
main = print $ fmap (+1) [1,2,3]

Bob
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20101218/7d141535/attachment-0001.htm>


More information about the Haskell-Cafe mailing list