Opened 22 months ago

Last modified 3 weeks ago

#8761 new feature request

Make pattern synonyms work with Template Haskell

Reported by: goldfire Owned by:
Priority: normal Milestone: 8.0.1
Component: Template Haskell Version:
Keywords: PatternSynonyms Cc: merijn@…, cactus, cocreature
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: None/Unknown Test Case:
Blocked By: Blocking:
Related Tickets: Differential Rev(s):
Wiki Page:


Template Haskell has no support for pattern synonyms. This should be added.


  • Create syntax in Language.Haskell.TH.Syntax and corresponding functions in Language.Haskell.TH.Lib
  • Support in DsMeta for desugaring pattern synonym quotations. See rep_bind.
  • Support in Convert for splicing in pattern synonyms.
  • Support in TcSplice for reifying pattern synonyms. See reifyThing.

Change History (13)

comment:1 Changed 22 months ago by thoughtpolice

  • Milestone set to 7.8.2
  • Version 7.8.1-rc1 deleted

This isn't going to be done in time for 7.8.1 at least.

comment:2 Changed 22 months ago by thoughtpolice

Or, well, unless you propose to add it (very soon), Richard. :)

comment:3 Changed 22 months ago by goldfire

No. My thought is that the TH interface should (barring some large disaster) remain stable from the RC to the released version. That way, packages that use TH can test against the RC and be confident that their code will work against the release. Even if I were to implement it today (no plans to), I wouldn't recommend merging. I created the ticket just as a reminder (to anyone) that this should be done.

comment:4 Changed 20 months ago by thoughtpolice

  • Milestone changed from 7.8.2 to 7.8.3

comment:5 Changed 19 months ago by thoughtpolice

  • Milestone changed from 7.8.3 to 7.10.1

Moving to 7.10.1

comment:6 Changed 19 months ago by merijn

  • Cc merijn@… added

comment:7 Changed 13 months ago by cactus

  • Cc cactus added
  • Keywords pattern synonyms added

comment:8 Changed 12 months ago by cactus

  • Keywords PatternSynonyms added; pattern synonyms removed

comment:9 Changed 11 months ago by thoughtpolice

  • Milestone changed from 7.10.1 to 7.12.1

Moving to 7.12.1 milestone; if you feel this is an error and should be addressed sooner, please move it back to the 7.10.1 milestone.

comment:10 Changed 3 months ago by thoughtpolice

  • Milestone changed from 7.12.1 to 8.0.1

Milestone renamed

comment:11 Changed 4 weeks ago by sboo

one motivation is for fixed points

for example:

{-# LANGUAGE TemplateHaskell, PatternSynonyms, DeriveFunctor #-}

data TreeF a r
 = LitF a 
 | VarF String 
 | BinF r Operation r
 deriving Functor

data Operation = Add | ...

makeFix ''TreeF

would generate:

type Tree a = Fix (TreeF a)
pattern Lit :: a -> Tree a
pattern Lit a = Fix (LitF a)

pattern Var :: String -> Tree a
pattern Var s = Fix (VarF s)

pattern Bin :: Tree a -> Operation -> Tree a -> Tree a
pattern Bin l op r = Fix (BinF l op r) 

which would make TreeF as easy to use as Tree when using pattern matching:

optimize :: Tree a -> Tree a 
optimize (Bin (Lit x) Add (Lit y)) = Lit (x + y) 
optimize ... = ...

and still as easy when using recursion schemes:

evalTreeF :: Map String Integer -> TreeF Integer (Maybe Integer) -> Maybe Integer 
evalTreeF environment (BinF (Just l) Add (Just r)) = Just (l + r) 
evalTreeF ...

evalTree :: Map String Integer -> Tree Integer -> Maybe Integer 
evalTree environment = cata (evalTreeF environment) 

(sorry if here's the wrong place, this is my first post)

comment:12 Changed 4 weeks ago by goldfire

This is the right place. Thanks for posting!

comment:13 Changed 3 weeks ago by cocreature

  • Cc cocreature added
Note: See TracTickets for help on using tickets.