Opened 2 years ago

Last modified 2 weeks ago

#8761 new feature request

Make pattern synonyms work with Template Haskell

Reported by: goldfire Owned by: cocreature
Priority: normal Milestone:
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:

Description

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

Specifically:

  • 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 (15)

comment:1 Changed 2 years 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 2 years ago by thoughtpolice

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

comment:3 Changed 2 years 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 22 months ago by thoughtpolice

  • Milestone changed from 7.8.2 to 7.8.3

comment:5 Changed 22 months ago by thoughtpolice

  • Milestone changed from 7.8.3 to 7.10.1

Moving to 7.10.1

comment:6 Changed 22 months ago by merijn

  • Cc merijn@… added

comment:7 Changed 15 months ago by cactus

  • Cc cactus added
  • Keywords pattern synonyms added

comment:8 Changed 14 months ago by cactus

  • Keywords PatternSynonyms added; pattern synonyms removed

comment:9 Changed 14 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 5 months ago by thoughtpolice

  • Milestone changed from 7.12.1 to 8.0.1

Milestone renamed

comment:11 Changed 3 months ago by sboo

one motivation is for fixed points https://www.reddit.com/r/haskell/comments/3qrkzr/one_weird_trick_for_nicer_functor_fixpoints/cwhsy6i

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 3 months ago by goldfire

This is the right place. Thanks for posting!

comment:13 Changed 3 months ago by cocreature

  • Cc cocreature added

comment:14 Changed 6 weeks ago by cocreature

  • Owner set to cocreature

comment:15 Changed 2 weeks ago by thomie

  • Milestone 8.0.1 deleted
Note: See TracTickets for help on using tickets.