PatternSynonyms doesn't accept non-prenex quantified functions, doesn't float foralls
This works under GHC HEAD (8.7.20190115)
{-# Language RankNTypes #-}
{-# Language ViewPatterns #-}
{-# Language PatternSynonyms #-}
newtype Logic a = Logic (forall xx. (a -> (xx -> xx)) -> (xx -> xx))
runLogic :: Logic a -> forall xx. (a -> xx -> xx) -> (xx -> xx)
runLogic (Logic logic) = logic
pattern L :: (forall xx. (a -> xx -> xx) -> xx -> xx) -> Logic a
pattern L f <- (runLogic -> f)
I was under the impression that these would be equivalent
runLogic :: Logic a -> forall xx. (a -> xx -> xx) -> (xx -> xx)
runLogic :: Logic a -> (a -> xx -> xx) -> (xx -> xx)
apart from the order of visible type application and such, but it fails:
{-# Language RankNTypes #-}
{-# Language ViewPatterns #-}
{-# Language PatternSynonyms #-}
newtype Logic a = Logic (forall xx. (a -> (xx -> xx)) -> (xx -> xx))
runLogic :: Logic a -> (a -> xx -> xx) -> (xx -> xx)
runLogic (Logic logic) = logic
pattern L :: (forall xx. (a -> xx -> xx) -> xx -> xx) -> Logic a
pattern L f <- (runLogic -> f)
$ ... -ignore-dot-ghci 1022_bug.hs
GHCi, version 8.7.20190115: https://www.haskell.org/ghc/ :? for help
[1 of 1] Compiling Main ( 1022_bug.hs, interpreted )
1022_bug.hs:11:29: error:
• Couldn't match expected type ‘forall xx.
(a -> xx -> xx) -> xx -> xx’
with actual type ‘(a -> xx0 -> xx0) -> xx0 -> xx0’
• In the declaration for pattern synonym ‘L’
• Relevant bindings include
f :: (a -> xx0 -> xx0) -> xx0 -> xx0 (bound at 1022_bug.hs:11:29)
|
11 | pattern L f <- (runLogic -> f)
| ^
Failed, no modules loaded.
Prelude>
Trac metadata
| Trac field | Value |
|---|---|
| Version | 8.7 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |