Hi, all.
Plenty of answers. Thank you.
Putting the list in the IO monad was deliberate. Another one I was looking at was
f :: String -> IO String
f s = do return s
main = do ios <- f "hello"
fmap tail ios
which worked fine
So, the big error was trying to add 1 + [1,2,3,4,5].
I considered that I needed an additional fmap and thought I had tried
fmap (fmap (1+)) iol
but must have messed it up, because I got an error. I guess I was on the right track.
I like to try various combinations to test my understanding. It's kind of embarrassing when I get stumped by something simple like this, but that's how one learns.
Thanks again,
Michael
--- On Fri, 12/17/10, Daniel Fischer
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
The fmap is relative to IO, your code is equivalent to do let lst = (return [1,2,3,4,5]) fmap (+1) lst ~> fmap (+1) (return [1,2,3,4,5]) ~> do lst <- return [1,2,3,4,5] return $ (+1) lst but there's no instance Num [Int] in scope You probably meant do let lst = f [1,2,3,4,5] fmap (map (+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>