[Haskell-cafe] Why is Haskell flagging this?

Daniel Fischer daniel.is.fischer at googlemail.com
Fri Dec 17 22:24:19 CET 2010


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>




More information about the Haskell-Cafe mailing list