Empty constraint tuple error with typeclass instance in TemplateHaskellQuotes
Take the following module:
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE Haskell2010 #-}
import Language.Haskell.TH.Syntax
class Foo a
instance () => Foo [a]
$([d| instance () => Foo Char |])
$([d| instance $(pure $ TupleT 0) => Foo Int |])
main = pure ()
I would expect all of this to compile without an error. But in practice this I get this error with GHC 9.6:
T.hs:10:2: error: [GHC-77539]
• Illegal tuple constraint: () :: Constraint
• In the instance declaration for ‘Foo Int’
Suggested fix: Perhaps you intended to use ConstraintKinds
|
10 | $([d| instance $(pure $ TupleT 0) => Foo Int |])
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The InstanceD
constructor has a [Type]
field to represent the list of constraints, but it looks like splicing requires a Q Type
. Using type tuples either using [t|...|]
or using TupleT
seems to lead to this ConstraintKinds
error.
It should be possible to do this without ConstraintKinds
given that the non-TH instance works fine.