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

GHC ghc-devs at haskell.org
Tue Apr 10 11:40:59 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
      Resolution:                    |             Keywords:
                                     |  PatternSynonyms
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Description changed by Iceland_jack:

Old description:

> 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)
>    |                                  ^^^
> }}}

New description:

 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 `V`, 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#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list