
To make that a little clearer, here is code that uses two calls to fmap to
drill through two monadic layers:
f :: [Int] -> IO [Int]
f lst = do return lst
main = do let lst = f [1,2,3,4,5]
fmap (fmap (+1)) lst
So the order of operations is :
1. The first fmap converts an IO [Int] to [Int] and hands it off to the
second fmap
2. The second fmap applies the (+1) function to every element of the list.
3. The second fmap re-wraps the elements back into a [Int]
4. The first fmap re-wraps and returns the transformed [Int] into an IO
[Int].
-deech
On Fri, Dec 17, 2010 at 3:27 PM, aditya siram
I think it is giving you the error because you the "fmap" in your code is operating on the IO monad and not the List monad. In order to get it to work, you can remove the IO layer with ">>=" as below:
f :: [Int] -> IO [Int] f lst = do return lst
main = do let lst = f [1,2,3,4,5] lst >>= return . fmap (+1)
Or you can not wrap the list in IO to begin with, my guess is that you wrote 'f' to make the compiler happy at some point in development: main = do let lst = [1,2,3,4,5] return $ fmap (+1) lst
-deech
On Fri, Dec 17, 2010 at 11:04 AM, michael rice
wrote: I don't understand this error message. Haskell appears not to understand that 1 is a Num.
Prelude> :t 1 1 :: (Num t) => t Prelude> :t [1,2,3,4,5] [1,2,3,4,5] :: (Num t) => [t] Prelude>
Michael
===================
f :: [Int] -> IO [Int] f lst = do return lst
main = do let lst = f [1,2,3,4,5] fmap (+1) lst
===============================
Prelude> :l test [1 of 1] Compiling Main ( test.hs, interpreted )
test.hs:5:17: No instance for (Num [Int]) arising from the literal `1' at test.hs:5:17 Possible fix: add an instance declaration for (Num [Int]) In the second argument of `(+)', namely `1' In the first argument of `fmap', namely `(+ 1)' In the expression: fmap (+ 1) lst Failed, modules loaded: none. Prelude>
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe