TypeFamilies or GADT suddenly breaks valid code

I have a very innocent looking code

data Config = Config { cInts :: [Int] , cStrings :: [String] } instance Semigroup Config where c1 <> c2 = Config { cInts = andCombiner cInts , cStrings = andCombiner cStrings } where andCombiner field = field c1 <> field c2 

It compiles and works fine. However, if I add the extension TypeFamilies or GADTs , I see a very strange error:

 .../Main.hs:19:22: error: • Couldn't match type 'Int' with '[Char]' Expected type: [String] Actual type: [Int] • In the 'cStrings' field of a record In the expression: Config {cInts = andCombiner cInts, cStrings = andCombiner cStrings} In an equation for '<>': c1 <> c2 = Config {cInts = andCombiner cInts, cStrings = andCombiner cStrings} where andCombiner field = field c1 <> field c2 | 19 | , cStrings = andCombiner cStrings } | ^^^^^^^^^^^^^^^^^^^^ .../Main.hs:19:34: error: • Couldn't match type '[Char]' with 'Int' Expected type: Config -> [Int] Actual type: Config -> [String] • In the first argument of 'andCombiner', namely 'cStrings' In the 'cStrings' field of a record In the expression: Config {cInts = andCombiner cInts, cStrings = andCombiner cStrings} | 19 | , cStrings = andCombiner cStrings } | ^^^^^^^^ 

What is the cause of this compiler error?

+7
type-inference haskell gadt type-families
source share
1 answer

This is due to -XMonoLocalBinds , which implies -XGADTs and -XTypeFamilies . You can get your compilation code again by adding a type signature to andCombiner (or by including -XNoMonoLocalBinds , although I do not recommend this):

 instance Semigroup Config where c1 <> c2 = Config { cInts = andCombiner cInts , cStrings = andCombiner cStrings } where andCombiner :: Semigroup a => (Config -> a) -> a andCombiner field = field c1 <> field c2 

Using the terminology from the GHC documents I am associated with, andCombiner not fully generalized, as it mentions c1 and c2 that are not closed or imported.

+10
source share

All Articles