Instance inference failure with GADTs
Consider the following code:
{-# LANGUAGE GADTs, FlexibleInstances #-}
class Stringable a where
toString :: a -> String
data GADT a where
GInt :: GADT Int
GBool :: GADT Bool
instance Stringable (GADT Int) where
toString _ = "constructor GInt"
instance Stringable (GADT Bool) where
toString _ = "constructor GBool"
mkString :: GADT a -> String
mkString g = toString g
mkString' :: GADT a -> String
mkString' g = case g of
GInt -> toString g
GBool -> toString g
The function mkString does not compile, while the function mkString' does. The problem seems to be that there is no instance declaration for GADT a, although there are instances for all the possible instantiations of a. It seems that requiring a case statement where all patterns are accounted for and all branches contain the same expression should be unnecessary.
This was tested on 7.5.20120426.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.5 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |