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 <daniel.is.fisc...@googlemail.com> wrote: From: Daniel Fischer <daniel.is.fisc...@googlemail.com> Subject: Re: [Haskell-cafe] Why is Haskell flagging this? To: haskell-cafe@haskell.org Cc: "michael rice" <nowg...@yahoo.com> Date: Friday, December 17, 2010, 4:24 PM On Friday 17 December 2010 18:04:20, 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 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> --- On Fri, 12/17/10, Daniel Fischer <daniel.is.fisc...@googlemail.com> wrote: From: Daniel Fischer <daniel.is.fisc...@googlemail.com> Subject: Re: [Haskell-cafe] Why is Haskell flagging this? To: haskell-cafe@haskell.org Cc: "michael rice" <nowg...@yahoo.com> Date: Friday, December 17, 2010, 4:24 PM On Friday 17 December 2010 18:04:20, 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 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>
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe