
#12787: Weird type constraint with undecidable instances -------------------------------------+------------------------------------- Reporter: nome | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler (Type | Version: 8.0.1 checker) | Keywords: Resolution: | UndecidableInstances Operating System: Linux | Architecture: x86_64 Type of failure: GHC rejects | (amd64) valid program | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by nome): Maybe I've minimized the example a bit too much. The `PartialOrd` instance given is not meant to be universal, but as a default. In a slightly more realistic example, it would be made overlappable, like so: {{{#!hs instance {-# OVERLAPPABLE #-} TotalOrd a => PartialOrd a where tryCompare x y = Just $ tcompare x y }}} And there would be additional instances, e.g. {{{#!hs import Data.List -- insert classes and instances as above instance Eq a => PartialOrd [a] where tryCompare xs ys = if xs == ys then Just EQ else if null (xs \\ ys) then Just LT else if null (ys \\ xs) then Just GT else Nothing }}} If I understand [https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts... #instance-overlap overlapping instances] correctly, GHC should consider ''all'' applicable instances and be "conservative about committing to an overlapping instance", so I would expect it to refrain from committing to the `TotalOrd a => PartialOrd a` one. Still, even with these additions, I get the same error. Ideally, the default implementation would be part of the `PartialOrd` class (like default implementations of the class's own methods); but it seems that there's no way to provide default implementations for superclass methods in a class declaration. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12787#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler