
#8634: Relax functional dependency coherence check ("liberal coverage condition") -------------------------------------+------------------------------------- Reporter: danilo2 | Owner: Type: feature | Status: new request | Milestone: 7.10.1 Priority: high | Version: 7.7 Component: Compiler | Keywords: Resolution: | Operating System: Unknown/Multiple Differential Revisions: Phab:D69 | Type of failure: None/Unknown Architecture: | Test Case: Unknown/Multiple | Blocking: Difficulty: Unknown | Blocked By: | Related Tickets: #1241, | #2247, #8356, #9103, #9227 | -------------------------------------+------------------------------------- Comment (by danilo2): @emertens: I know it really well, it would not work - look at this example: {{{#!haskell {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE UndecidableInstances #-} class Property a b where property :: a -> b data X = X data Y = Y deriving Show data Z = Z deriving Show instance (y ~ Y) => Property X y where property _ = Y instance (z ~ Z) => Property Y z where property _ = Z tst a = property $ property a main = do print (property $ property X) }}} Error: {{{#!haskell Could not deduce (Property s0 b) arising from the ambiguity check for ‘tst’ from the context (Property a s, Property s b) bound by the inferred type for ‘tst’: (Property a s, Property s b) => a -> b at Tmp.hs:21:1-29 The type variable ‘s0’ is ambiguous When checking that ‘tst’ has the inferred type tst :: forall b s a. (Property a s, Property s b) => a -> b Probable cause: the inferred type is ambiguous }}} It will work for simple examples but will fail for functions like `tst` - it's caused by open world assumption - you never knows if there will be another instance defined, which will be more precise than already defined (with `-XOverlappingInstances` enabled). The only way around is to use fundeps here :) -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8634#comment:36 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler