Skip to content

template-haskell's RecordWildCards support

Summary

RecordWildCards syntax Con {..} doesn't appear to be represented in template-haskell.

Suppose we have a data type:

data G = H { field0 :: Int, field1 :: String }
  deriving stock Show

Using [e|H {..}|] yields RecConE Main.H [].

But this is indistinguishable from [e|H {}|].

However, using H {} in place of H {..} won't compile if H has fields.

Expected behavior

Have RecConE support wildcards.

(Solutionising)

Perhaps something like:

data RecWild = NoRecWildCard | RecWildCard

data Exp ...
  | RecConE Name [FieldExp] RecWild

data Pat ...
  | RecP Name [FieldPat] RecWild

Supporting both H {..} and H {field1=42, ..}.

Maybe .Lib could keep its existing recConE & recP but add recConWildE & recWildP? (if that's desirable)

recConE :: Quote m => Name -> [m (Name, Exp)] -> m Exp
recConE c fs = do { flds <- sequenceA fs; pure (RecConE c flds NoRecWildCard) }

recConWildE :: Quote m => Name -> [m (Name, Exp)] -> m Exp
recConWildE c fs = do { flds <- sequenceA fs; pure (RecConE c flds RecWildCard) }

Environment

  • GHC version used: 9.8.2 and below.
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information