
#10532: Unnecessary constraints when using overlapping instances -------------------------------------+------------------------------------- Reporter: MikeIzbicki | Owner: Type: bug | Status: closed Priority: normal | Milestone: Component: Compiler (Type | Version: 7.10.1 checker) | Keywords: Resolution: invalid | Architecture: Operating System: Unknown/Multiple | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by goldfire): What would you like to happen when GHC sees `(f (3 :: Int))`? My guess is that you expect GHC to notice that there is an instance for `Foo Int` around and to use it. But if `f` had the type `a -> Int`, then there is nothing to tell GHC to go out and look for the instance. When we have `f :: Foo a => a -> Int`, it tells GHC to look for a `Foo` instance at call sites. If, on the other hand, you want `f` always to use the `Foo a` instance, then `IncoherentInstances` is the way to go. I don't see this as an issue of parametricity, but just one of a misunderstanding about what the type signature means. As for what happens when you omit the signature: You're hitting the monomorphism restriction. When I load this into GHCi: {{{ {-# LANGUAGE FlexibleInstances, NoMonomorphismRestriction #-} class Foo a where foo :: a -> Int instance {-# OVERLAPS #-} Foo Int where foo = id instance {-# OVERLAPPABLE #-} Foo a where foo _ = 5 f = foo }}} I get an inferred type for `f` of `Foo a => a -> Int`. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10532#comment:9 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler