[GHC] #14010: UndecidableSuperClasses - Could not deduce (Category d)
GHC
ghc-devs at haskell.org
Sat Jul 22 12:13:11 UTC 2017
#14010: UndecidableSuperClasses - Could not deduce (Category d)
-------------------------------------+-------------------------------------
Reporter: int-index | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.0.1
Keywords: | Operating System: Unknown/Multiple
UndecidableSuperClasses |
Architecture: | Type of failure: GHC rejects
Unknown/Multiple | valid program
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
Consider this well-typed code:
{{{#!hs
{-# LANGUAGE NoImplicitPrelude, TypeInType, TypeFamilies,
UndecidableSuperClasses, RankNTypes, TypeOperators,
FlexibleContexts, TypeSynonymInstances, FlexibleInstances,
UndecidableInstances #-}
module Monolith where
import Data.Kind (Type)
import GHC.Exts (Constraint)
type family (~>) :: c -> c -> Type
type instance (~>) = (->)
type instance (~>) = ArrPair
type family Fst (p :: (a, b)) :: a where
Fst '(x, _) = x
type family Snd (p :: (a, b)) :: b where
Snd '(_, y) = y
data ArrPair a b = ArrPair (Fst a ~> Fst b) (Snd a ~> Snd b)
type family Super c :: Constraint where
Super Type = ()
Super (c, d) = (Category c, Category d)
class Super cat => Category cat where
id :: forall (a :: cat). a ~> a
instance Category Type where
id = \x -> x
instance (Category c, Category d) => Category (c, d) where
id = ArrPair id id
class Category (c, d) => Functor (f :: c -> d) where
--class (Category c, Category d) => Functor (f :: c -> d) where
map :: (a ~> b) -> (f a ~> f b)
data OnSnd f a b = OnSnd (f '(a, b))
instance Functor (f :: (c, d) -> Type) => Functor (OnSnd f a) where
map f (OnSnd x) = OnSnd (map (ArrPair id f) x)
}}}
The compiler accepts it. But if I change the definition of 'Functor' for
the commented one, I get an error:
{{{
super.hs:39:10: error:
• Could not deduce (Category d)
arising from the superclasses of an instance declaration
from the context: Functor f
bound by the instance declaration at super.hs:39:10-61
Possible fix:
add (Category d) to the context of the instance declaration
• In the instance declaration for ‘Functor (OnSnd f a)’
|
39 | instance Functor (f :: (c, d) -> Type) => Functor (OnSnd f a) where
|
}}}
I can reproduce this on 8.0.1, 8.2.0.20170704 and HEAD.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14010>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list