Improve output of pattern synonym info
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 ‘~#’
).
-- 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 heterogeneous equality from GHC.Types (~~
)
pattern IsList :: forall k2 (b :: k2). () => ((* -> *) ~ k2, [] ~~ b) => TypeRep b
and in the end, we only need
pattern IsList :: () => [] ~~ b => T b
:info
should show something closer to that! Copy-pasting should work