
#8581: Add support for explicitly-bidirectional pattern synonyms -------------------------------------+------------------------------------- Reporter: cactus | Owner: cactus Type: feature | Status: closed request | Milestone: 7.10.1 Priority: normal | Version: Component: Compiler | Keywords: Resolution: fixed | Architecture: Unknown/Multiple Operating System: | Difficulty: Unknown Unknown/Multiple | Blocked By: 5144 Type of failure: | Related Tickets: None/Unknown | Test Case: | Blocking: | Differential Revisions: | -------------------------------------+------------------------------------- Comment (by mpickering): I just tried out this patch and it seems strange to me that the constructor synonym has the same class constraints as the pattern. Is this by design? Here is an example which would have worked really nicely if not for this restriction. I know you can get around this by defining your own constructors with the right types. Note that there is no `View` instance for `Holey` which makes sense but we can still define a `Construct` instance. {{{ {-# LANGUAGE PatternSynonyms, ViewPatterns #-} data ExpF a = AddF a a | NumF Int deriving Show class Construct a where construct :: ExpF a -> a class View a where view :: a -> ExpF a newtype Exp = Exp (ExpF Exp) deriving (Show) instance Construct Exp where construct e = Exp e instance View Exp where view (Exp e) = e data Holey = Hole | NonHole (ExpF Holey) instance Construct Holey where construct = NonHole data AttrExpr = AttrExpr [String] (ExpF AttrExpr) pattern Add a b <- (view -> AddF a b) where Add a b = (construct (AddF a b)) pattern Num n <- (view -> NumF n) where Num n = (construct (NumF n)) }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8581#comment:9 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler