[GHC] #15693: Abstracting out pattern into a pattern synonym fails with scary error
GHC
ghc-devs at haskell.org
Sun Sep 30 14:55:55 UTC 2018
#15693: Abstracting out pattern into a pattern synonym fails with scary error
-------------------------------------+-------------------------------------
Reporter: Iceland_jack | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone: 8.6.1
Component: Compiler | Version: 8.6.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:
-------------------------------------+-------------------------------------
This '''works'''
{{{#!hs
{-# Language DataKinds, TypeOperators, PolyKinds, PatternSynonyms, GADTs
#-}
import Data.Kind
data Ctx :: Type -> Type where
E :: Ctx(Type)
(:&:) :: a -> Ctx(as) -> Ctx(a -> as)
data ApplyT(kind::Type) :: kind -> Ctx(kind) -> Type where
AO :: a -> ApplyT(Type) a E
AS :: ApplyT(ks) (f a) ctx
-> ApplyT(k -> ks) f (a:&:ctx)
foo :: ApplyT(Type -> Type -> Type) Either a -> ()
foo (ASSO (Left a)) = ()
pattern ASSO a = AS (AS (AO a))
}}}
but then you might think, let's give a name (pattern synonym) to `ASSO
(Left a)`
This '''fails'''
{{{#!hs
{-# Language DataKinds, TypeOperators, PolyKinds, PatternSynonyms, GADTs
#-}
import Data.Kind
data Ctx :: Type -> Type where
E :: Ctx(Type)
(:&:) :: a -> Ctx(as) -> Ctx(a -> as)
data ApplyT(kind::Type) :: kind -> Ctx(kind) -> Type where
AO :: a -> ApplyT(Type) a E
AS :: ApplyT(ks) (f a) ctx
-> ApplyT(k -> ks) f (a:&:ctx)
pattern ASSO a = AS (AS (AO a))
pattern ASSOLeft a = ASSO (Left a)
}}}
{{{
$ ghci -ignore-dot-ghci 464.hs
GHCi, version 8.7.20180828: http://www.haskell.org/ghc/ :? for help
[1 of 1] Compiling Main ( hs/464.hs, interpreted )
hs/464.hs:16:22: error:
• Couldn't match type ‘k1’ with ‘*’
‘k1’ is a rigid type variable bound by
the signature for pattern synonym ‘ASSOLeft’
at hs/464.hs:16:1-34
Expected type: ApplyT kind a b
Actual type: ApplyT (* -> * -> *) Either (a1 ':&: (a20 ':&: 'E))
• In the expression: ASSO (Left a)
In an equation for ‘ASSOLeft’: ASSOLeft a = ASSO (Left a)
|
16 | pattern ASSOLeft a = ASSO (Left a)
| ^^^^^^^^^^^^^
hs/464.hs:16:28: error:
• Could not deduce: k1 ~ *
from the context: (kind ~ (k -> ks), a ~~ f, b ~~ (a2 ':&: ctx),
ks ~ (k1 -> ks1), f a2 ~~ f1, ctx ~~ (a3 ':&:
ctx1), ks1 ~ *,
f1 a3 ~~ a4, ctx1 ~~ 'E)
bound by a pattern with pattern synonym:
ASSO :: forall kind (a :: kind) (b :: Ctx kind).
() =>
forall ks k (f :: k -> ks) (a1 :: k) (ctx ::
Ctx
ks) ks1 k1 (f1 :: k1
-> ks1) (a2 :: k1) (ctx1 :: Ctx
ks1) a3.
(kind ~ (k -> ks), a ~~ f, b ~~ (a1 ':&: ctx),
ks ~ (k1 -> ks1),
f a1 ~~ f1, ctx ~~ (a2 ':&: ctx1), ks1 ~ *, f1
a2 ~~ a3,
ctx1 ~~ 'E) =>
a3 -> ApplyT kind a b,
in a pattern synonym declaration
at hs/464.hs:16:22-34
‘k1’ is a rigid type variable bound by
a pattern with pattern synonym:
ASSO :: forall kind (a :: kind) (b :: Ctx kind).
() =>
forall ks k (f :: k -> ks) (a1 :: k) (ctx :: Ctx
ks) ks1
k1 (f1 :: k1
-> ks1) (a2 :: k1) (ctx1 :: Ctx
ks1) a3.
(kind ~ (k -> ks), a ~~ f, b ~~ (a1 ':&: ctx), ks ~ (k1
-> ks1),
f a1 ~~ f1, ctx ~~ (a2 ':&: ctx1), ks1 ~ *, f1 a2 ~~
a3,
ctx1 ~~ 'E) =>
a3 -> ApplyT kind a b,
in a pattern synonym declaration
at hs/464.hs:16:22-34
When matching types
a3 :: k1
b0 :: *
Expected type: a4
Actual type: Either a1 b0
• In the pattern: Left a
In the pattern: ASSO (Left a)
In the declaration for pattern synonym ‘ASSOLeft’
|
16 | pattern ASSOLeft a = ASSO (Left a)
| ^^^^^^
Failed, no modules loaded.
Prelude>
}}}
----
Can I, as a user, assume that any valid pattern `foo (ASSO (Left a)) =
...` can be abstracted into a pattern synonym? There error message is too
scary for me to sensibly know what to expect
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15693>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list