Opened 2 years ago

Last modified 2 months ago

#8761 new feature request

Make pattern synonyms work with Template Haskell

Reported by: goldfire Owned by: bollmann
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): Phab:D1940
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 (19)

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 2 years ago by thoughtpolice

  • Milestone changed from 7.8.2 to 7.8.3

comment:5 Changed 2 years ago by thoughtpolice

  • Milestone changed from 7.8.3 to 7.10.1

Moving to 7.10.1

comment:6 Changed 2 years ago by merijn

  • Cc merijn@… added

comment:7 Changed 18 months ago by cactus

  • Cc cactus added
  • Keywords pattern synonyms added

comment:8 Changed 17 months ago by cactus

  • Keywords PatternSynonyms added; pattern synonyms removed

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

  • Milestone changed from 7.12.1 to 8.0.1

Milestone renamed

comment:11 Changed 6 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 6 months ago by goldfire

This is the right place. Thanks for posting!

comment:13 Changed 6 months ago by cocreature

  • Cc cocreature added

comment:14 follow-up: Changed 4 months ago by cocreature

  • Owner set to cocreature

comment:15 Changed 3 months ago by thomie

  • Milestone 8.0.1 deleted

comment:16 in reply to: ↑ 14 ; follow-up: Changed 3 months ago by bollmann

Replying to cocreature:

Have you been working on this cocreature? Otherwise, I'd love to take ownership of this ticket. :-)

comment:17 in reply to: ↑ 16 Changed 3 months ago by cocreature

  • Owner cocreature deleted

Replying to bollmann:

Replying to cocreature:

Have you been working on this cocreature? Otherwise, I'd love to take ownership of this ticket. :-)

I started working on it, but I ran out of time to finish it. I just pushed the current status. Feel free to pick it up or start from scratch.

comment:18 Changed 3 months ago by bollmann

  • Owner set to bollmann

thanks cocreature, I'll have a look at this feature now.

Last edited 3 months ago by bollmann (previous) (diff)

comment:19 Changed 2 months ago by bollmann

  • Differential Rev(s) set to Phab:D1940

I added an initial version of "pattern synonym support in TH" with a couple of questions for feedback. See https://phabricator.haskell.org/D1940.

Note: See TracTickets for help on using tickets.