
#13754: ghc-8.0.2+ rejects more instance declarations -------------------------------------+------------------------------------- Reporter: zilinc | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.2 Keywords: | Operating System: Unknown/Multiple Architecture: | Type of failure: None/Unknown Unknown/Multiple | Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- Sorry for the vague title. For a program (sorry again but I failed to shrink it further): {{{ {-# language ExistentialQuantification, KindSignatures, DataKinds, GADTs, UndecidableInstances, AllowAmbiguousTypes #-} class Pretty a where pretty :: a -> String prettyList :: [a] -> String prettyList = concatMap pretty data Def e = forall t. FunDef (Type t) (e t) data Nat = Z | S Nat data F (t :: Nat) where FZ :: F (S Z) FS :: F n -> F (S n) data Type (t :: Nat) = TVar (F t) data Expr (t :: Nat) e = Fun (Type t) | App (e t) (e t) data TE t = TE (Type t) (Expr t TE) -- all methods left undefined, as they're insignificant instance Pretty t => Pretty [t] where pretty = undefined instance (Pretty (e t)) => Pretty (Def e) where pretty (FunDef t e) = undefined instance Pretty (Type t) where pretty (TVar t) = undefined instance Pretty (e t) => Pretty (Expr t e) where pretty (Fun t) = undefined pretty (App e1 e2) = undefined instance Pretty (TE t) where pretty (TE t e) = undefined }}} ghc-8.0.1 is happy with it, whereas later versions (tested with 8.0.2 and 8.2.1-rc2) reject it. The error msg is: {{{ GHCInstance1.hs:27:10: error: • Could not deduce (Pretty (e t0)) arising from a use of ‘Main.$dmprettyList’ from the context: Pretty (e t) bound by the instance declaration at GHCInstance1.hs:27:10-41 The type variable ‘t0’ is ambiguous Relevant bindings include prettyList :: [Def e] -> String (bound at GHCInstance1.hs:27:10) • In the expression: Main.$dmprettyList @Def e In an equation for ‘prettyList’: prettyList = Main.$dmprettyList @Def e In the instance declaration for ‘Pretty (Def e)’ }}} If I comment out the `prettyList` method from the class definition, then all happy. I'm not sure if it's a bug in 8.0.1 or a regression (and hard to reason about the behaviours). If it was the later, how should I migrate from 8.0.1? The `Pretty` class is a library (e.g. ansi-wl-pprint) so no way I can change it. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13754 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler