[GHC] #15079: GHC HEAD regression: cannot instantiate higher-rank kind
GHC
ghc-devs at haskell.org
Tue Apr 24 01:35:16 UTC 2018
#15079: GHC HEAD regression: cannot instantiate higher-rank kind
-------------------------------------+-------------------------------------
Reporter: RyanGlScott | Owner: (none)
Type: bug | Status: new
Priority: high | Milestone: 8.6.1
Component: Compiler (Type | Version: 8.5
checker) |
Resolution: | Keywords: TypeInType
Operating System: Unknown/Multiple | Architecture:
Type of failure: GHC rejects | Unknown/Multiple
valid program | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by RyanGlScott):
A more complicated example that also typechecks in 8.2.2 and 8.4.2, but
not in GHC HEAD:
{{{#!hs
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeInType #-}
{-# LANGUAGE TypeOperators #-}
module Bug where
import Data.Kind
import qualified Data.Type.Equality as Eq
import GHC.Exts (Any)
infixl 4 :==
-- | Heterogeneous Leibnizian equality.
newtype (a :: j) :== (b :: k)
= HRefl { hsubst :: forall (c :: forall (i :: Type). i -> Type). c a ->
c b }
newtype Flay :: (forall (i :: Type). i -> i -> Type)
-> forall (j :: Type). j -> forall (k :: Type). k -> Type
where
Flay :: forall (p :: forall (i :: Type). i -> i -> Type)
(j :: Type) (k :: Type) (a :: j) (b :: k).
{ unflay :: p a (MassageKind j b) } -> Flay p a b
type family MassageKind (j :: Type) (a :: k) :: j where
MassageKind j (a :: j) = a
MassageKind _ _ = Any
fromLeibniz :: forall a b. a :== b -> a Eq.:~: b
fromLeibniz f = unflay $ hsubst f $ Flay Eq.Refl
}}}
{{{
$ ~/Software/ghc/inplace/bin/ghc-stage2 Bug.hs
[1 of 1] Compiling Bug ( Bug.hs, Bug.o )
Bug.hs:29:42: error:
• Kind mismatch: cannot unify (p0 :: forall i. i -> i -> *) with:
(Eq.:~:) :: forall k. k -> k -> *
Their kinds differ.
Expected type: p0 k a (MassageKind k a)
Actual type: a Eq.:~: a
• In the first argument of ‘Flay’, namely ‘Eq.Refl’
In the second argument of ‘($)’, namely ‘Flay Eq.Refl’
In the second argument of ‘($)’, namely ‘hsubst f $ Flay Eq.Refl’
|
29 | fromLeibniz f = unflay $ hsubst f $ Flay Eq.Refl
| ^^^^^^^
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15079#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list