[GHC] #12697: Improve output of pattern synonym info
GHC
ghc-devs at haskell.org
Fri Oct 14 21:38:35 UTC 2016
#12697: Improve output of pattern synonym info
-------------------------------------+-------------------------------------
Reporter: Iceland_jack | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.0.1
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:
@@ -59,1 +59,1 @@
- pattern List :: () => [] ~~ b => T b
+ pattern IsList :: () => [] ~~ b => T b
New description:
{{{#!hs
import GHC.Prim
import Data.Kind
data TypeRep :: forall k. k -> Type where
TI :: TypeRep Int
TB :: TypeRep Bool
TL :: TypeRep []
TA :: TypeRep f -> TypeRep x -> TypeRep (f x)
data (a::k1) :~~: (b::k2) where
HRefl :: a :~~: a
deriving instance Show (a :~~: b)
eqTT :: TypeRep (a::k1) -> TypeRep (b::k2) -> Maybe (a :~~: b)
eqTT TI TI = Just HRefl
eqTT TB TB = Just HRefl
eqTT TL TL = Just HRefl
pattern IsList <- (eqTT TL -> Just HRefl)
where IsList = TL
}}}
What is the type of `IsList`? The result of `:type` is only accurate when
used as an expression (`IsList :: TypeRep []`) and the result of `:info`
is uses `~#`
{{{
>>> :info IsList
pattern IsList :: forall k2 (b :: k2). () => ((* -> *) ~# k2,
[] ~# b) => TypeRep b
}}}
which won't parse (`parse error on input ‘~#’`).
{{{#!hs
-- t9R4.hs:20:67: error: …
-- • Expected kind ‘* -> *’, but ‘b’ has kind ‘k2’
-- • In the second argument of ‘~’, namely ‘b’
-- Compilation failed.
pattern IsList :: forall k2 (b :: k2). () => ((* -> *) ~ k2, [] ~ b) =>
TypeRep b
pattern IsList <- (eqTT TL -> Just HRefl)
where IsList = TL
}}}
The user may try to use `~` but we need
[https://hackage.haskell.org/package/ghc-prim-0.5.0.0/docs/GHC-
Types.html#t:-126--126- heterogeneous equality from GHC.Types] (`~~`)
{{{#!hs
pattern IsList :: forall k2 (b :: k2). () => ((* -> *) ~ k2, [] ~~ b) =>
TypeRep b
}}}
and in the end, we only need
{{{#!hs
pattern IsList :: () => [] ~~ b => T b
}}}
`:info` should show something closer to that! Copy-pasting should work
--
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12697#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list