[GHC] #15472: GHC HEAD type inference regression post-"Remove decideKindGeneralisationPlan"
GHC
ghc-devs at haskell.org
Fri Aug 3 21:07:25 UTC 2018
#15472: GHC HEAD type inference regression post-"Remove
decideKindGeneralisationPlan"
-------------------------------------+-------------------------------------
Reporter: RyanGlScott | Owner: (none)
Type: bug | Status: closed
Priority: highest | Milestone: 8.8.1
Component: Compiler (Type | Version: 8.5
checker) |
Resolution: invalid | 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):
Actually, here is an ever-so-slightly smaller way to trigger the issue
(which I also discovered in `singletons`)
{{{#!hs
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeInType #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Bug where
import Data.Kind
import Data.List.NonEmpty (NonEmpty(..))
data TyFun :: Type -> Type -> Type
type a ~> b = TyFun a b -> Type
infixr 0 ~>
type family Apply (f :: k1 ~> k2) (x :: k1) :: k2
data family Sing :: forall k. k -> Type
data instance Sing :: forall a. [a] -> Type where
SNil :: Sing '[]
SCons :: Sing x -> Sing xs -> Sing (x:xs)
data instance Sing :: forall a. NonEmpty a -> Type where
(:%|) :: Sing x -> Sing xs -> Sing (x :| xs)
type family LetGo x xs b cs where
LetGo x xs b (c:cs) = b <> LetGo x xs c cs
LetGo x xs b '[] = b
type family SconcatDefault (arg :: NonEmpty a) :: a where
SconcatDefault (x :| xs) = LetGo x xs x xs
class PSemigroup (a :: Type) where
type (<>) (arg1 :: a) (arg2 :: a) :: a
type Sconcat (arg :: NonEmpty a) :: a
type Sconcat arg = SconcatDefault arg
class SSemigroup a where
(%<>) :: forall (t1 :: a) (t2 :: a).
Sing t1 -> Sing t2 -> Sing (t1 <> t2 :: a)
sSconcat :: forall (t :: NonEmpty a).
Sing t -> Sing (Sconcat t :: a)
default sSconcat :: forall (t :: NonEmpty a).
(Sconcat t :: a) ~ SconcatDefault t
=> Sing t -> Sing (Sconcat t :: a)
sSconcat ((sA :: Sing x) :%| (sAs :: Sing xs))
= let sGo :: forall arg1 arg2.
Sing arg1 -> Sing arg2 -> Sing (LetGo x xs arg1 arg2)
sGo sB (SCons sC sCs) = sB %<> sGo sC sCs
sGo sB SNil = sB
in sGo sA sAs
}}}
This typechecks in GHC 8.4/8.6 but fails in HEAD with:
{{{
$ ~/Software/ghc4/inplace/bin/ghc-stage2 Bug.hs
[1 of 1] Compiling Bug ( Bug.hs, Bug.o )
Bug.hs:48:35: error:
• Could not deduce (SSemigroup k) arising from a use of ‘%<>’
from the context: SSemigroup a
bound by the class declaration for ‘SSemigroup’ at Bug.hs:37:7-16
or from: Sconcat t ~ SconcatDefault t
bound by the type signature for:
sSconcat :: forall (t :: NonEmpty a).
(Sconcat t ~ SconcatDefault t) =>
Sing t -> Sing (Sconcat t)
at Bug.hs:(42,23)-(44,53)
or from: t ~ (x ':| xs)
bound by a pattern with constructor:
:%| :: forall a (x :: a) (xs :: [a]).
Sing x -> Sing xs -> Sing (x ':| xs),
in an equation for ‘sSconcat’
at Bug.hs:45:13-47
or from: arg2 ~ (x1 : xs1)
bound by a pattern with constructor:
SCons :: forall a (x :: a) (xs :: [a]).
Sing x -> Sing xs -> Sing (x : xs),
in an equation for ‘sGo’
at Bug.hs:48:19-30
Possible fix:
add (SSemigroup k) to the context of
the data constructor ‘SCons’
or the type signature for:
sGo :: forall k (arg1 :: k) (arg2 :: [k]).
Sing arg1 -> Sing arg2 -> Sing (LetGo x xs arg1
arg2)
• In the expression: sB %<> sGo sC sCs
In an equation for ‘sGo’: sGo sB (SCons sC sCs) = sB %<> sGo sC sCs
In the expression:
let
sGo ::
forall arg1 arg2.
Sing arg1 -> Sing arg2 -> Sing (LetGo x xs arg1 arg2)
sGo sB (SCons sC sCs) = sB %<> sGo sC sCs
sGo sB SNil = sB
in sGo sA sAs
|
48 | sGo sB (SCons sC sCs) = sB %<> sGo sC sCs
| ^^^^^^^^^^^^^^^^^
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15472#comment:6>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list