
#13672: Pattern match on LHS of pattern synonym declaration -------------------------------------+------------------------------------- Reporter: Iceland_jack | Owner: (none) Type: feature | Status: new request | Priority: normal | Milestone: Component: Compiler | Version: 8.0.1 Keywords: | Operating System: Unknown/Multiple PatternSynonyms | Architecture: | Type of failure: None/Unknown Unknown/Multiple | Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- Changing `ZipList` to a newtype {{{#!hs import Data.Bifunctor.Fix import Data.Bifunctor.Tannen type ZipList = Fix (Tannen Maybe (,)) pattern Nil :: ZipList a pattern Nil = In (Tannen Nothing) infixr 5 ::: pattern (:::) :: a -> ZipList a -> ZipList a pattern a:::as = In (Tannen (Just (as, a))) }}} works fine for the `Nil` pattern synonym (it remains implicitly bidirectional) {{{#!hs newtype ZipList a = ZL (Fix (Tannen Maybe (,)) a) pattern Nil :: ZipList a pattern Nil = ZL (In (Tannen Nothing)) }}} but `(:::)` needs to be explicitly bidirectional {{{#!hs infixr 5 ::: pattern (:::) :: a -> ZipList a -> ZipList a pattern a:::as <- ZL (In (Tannen (Just (ZL -> as, a)))) where a:::ZL as = ZL (In (Tannen (Just (as, a)))) }}} ---- I would like to write it as {{{#!hs pattern (:::) :: a -> ZipList a -> ZipList a pattern a:::ZL as = ZL (In (Tannen (Just (as, a)))) }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13672 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler