[GHC] #15020: PatternSynonyms: Problems with quantified constraints / foralls

GHC ghc-devs at haskell.org
Tue Apr 10 11:40:36 UTC 2018


#15020: PatternSynonyms: Problems with quantified constraints / foralls
-------------------------------------+-------------------------------------
           Reporter:  Iceland_jack   |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:  8.6.1
          Component:  Compiler       |           Version:  8.5
           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:
-------------------------------------+-------------------------------------
 I couldn't find a way to implement `PLam2` as a simply bidirectional
 pattern synonym, I expected it to work but I recall a similar ticket. I
 couldn't find it though.

 {{{#!hs
 {-# Language RankNTypes, PatternSynonyms, ViewPatterns #-}

 newtype Lam1 = Lam1 (forall xx mm. Monad mm => mm xx)

 pattern PLam1 :: (forall xx mm. Monad mm => mm xx) -> Lam1
 pattern PLam1 a = Lam1 a

 --

 newtype Lam2 a = Lam2 (forall mm. Monad mm => mm a)

 newtype Forall f = Forall (forall xx. f xx)

 -- · FAILS ·
 -- pattern PLam2 :: (forall xx mm. Monad mm => mm xx) -> Forall Lam2
 -- pattern PLam2 lam = Forall (Lam2 lam)

 --

 get :: Forall Lam2 -> forall xx mm. Monad mm => mm xx
 get (Forall (Lam2 lam)) = lam

 pattern PLam3 :: (forall xx mm. Monad mm => mm xx) -> Forall Lam2
 pattern PLam3 lam <- (get -> lam)
   where PLam3 lam  = Forall (Lam2 lam)
 }}}

 The complaint is and I wonder if this is a limitation of PatternSynonyms

 {{{
     • Couldn't match type ‘xx0’ with ‘xx’
         because type variable ‘xx’ would escape its scope
       This (rigid, skolem) type variable is bound by
         a type expected by the context:
           forall xx (mm :: * -> *). Monad mm => mm xx
         at Test.hs:16:34-36
       Expected type: mm xx
         Actual type: mm xx0
     • In the declaration for pattern synonym ‘PLam2’
     • Relevant bindings include
         lam :: forall (mm :: * -> *). Monad mm => mm xx0
           (bound at Test.hs:16:34)
    |
 16 | pattern PLam2 lam = Forall (Lam2 lam)
    |                                  ^^^
 }}}

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15020>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list