Opened 3 years ago

Closed 2 years ago

#13454 closed bug (fixed)

Operators not allowed as fields in Record Pattern Synonyms

Reported by: Iceland_jack Owned by:
Priority: normal Milestone: 8.4.1
Component: Compiler Version: 8.0.1
Keywords: PatternSynonyms Cc:
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: None/Unknown Test Case:
Blocked By: Blocking:
Related Tickets: Differential Rev(s): Phab:D3379
Wiki Page:


I want to write the following record pattern synonym

pattern MkOp :: Op -> Exp -> Exp -> Exp
pattern MkOp {(·), a, b} <- (splitOp -> Just ((·), a, b))
  where MkOp (·) a b      = a · b

given this code

data Exp = Val Int | Add Exp Exp | Mul Exp Exp deriving Show

type Op = Exp -> Exp -> Exp

splitOp :: Exp -> Maybe (Op, Exp, Exp)
splitOp (Add a b) = Just (Add, a, b)
splitOp (Mul a b) = Just (Mul, a, b)
splitOp _         = Nothing

It works fine if (·) is replaced by operator. Fields of regular data types works just fine:

data F a = F {
  (·) :: a -> a -> a, 
  x   :: a, 
  y   :: a

f F{(·), x, y} = x·y
g F{..}        = x·y

Change History (3)

comment:1 Changed 2 years ago by mpickering

Differential Rev(s): Phab:D3379
Status: newpatch

comment:2 Changed 2 years ago by Ben Gamari <ben@…>

In 154d224a/ghc:

Allow operators as record pattern synonym fields

Fixes #13454

Reviewers: austin, bgamari, dfeuer

Reviewed By: dfeuer

Subscribers: RyanGlScott, rwbarton, thomie

Differential Revision:

comment:3 Changed 2 years ago by bgamari

Milestone: 8.4.1
Resolution: fixed
Status: patchclosed
Note: See TracTickets for help on using tickets.