[Haskell-cafe] strange GHCi type inference behavior involving map and partially applied functions
Ting Lei
tinlyx at hotmail.com
Sun Apr 15 22:31:20 CEST 2012
Hi All,
I found a really strange case where GHC and GHCi behave differently in inferring types. It took me hours to figure this out.
The following program
{-# LANGUAGE NoMonomorphismRestriction #-}
g x i = x ++ show i
[a,b] = map g ["X","Y"]
will not load without "NoMonomorphismRestriction". With that option, it will load and return the correct types (as expected):
*Main> :t [a,b]
[a,b] :: Show a => [a -> [Char]]
*Main> a 1
"X1"
However, if I do the same thing GHCi, the type inferencing seems to have been messed up:
*Main> let g x i = x ++ show i
*Main> let [a,b] = map g ["X","Y"]
*Main> :t [a,b]
[a,b] :: [() -> [Char]]
*Main> :t map g ["X","Y"]
map g ["X","Y"] :: Show a => [a -> [Char]]
Note how in the last two instances the terms on the left and right-hand sides of the definition return different types. Also, the correct return type should be a list of unary functions taking an (Show a) as
the parameter. Now the result is unusable:
*Main> a 1
<interactive>:52:3:
No instance for (Num ())
arising from the literal `1'
Possible fix: add an instance declaration for (Num ())
In the first argument of `a', namely `1'
In the expression: a 1
In an equation for `it': it = a 1
I am using GHCi 7.4.1 under windows. I also tried this under GHC 7.0x
Is this a GHCi bug or could anyone please explain why this can of strange behavior happens?
If this is a bug, could anyone with an account help file a bug for this?
Thanks in advance,
Ting
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20120415/1589d496/attachment.htm>
More information about the Haskell-Cafe
mailing list