
#7812: Ambiguity check too eager with unconstrained type variable --------------------------------------+------------------------------------- Reporter: goldfire | Owner: Type: bug | Status: closed Priority: normal | Milestone: Component: Compiler (Type checker) | Version: 7.7 Resolution: invalid | Keywords: AmbiguityCheck Os: Unknown/Multiple | Architecture: Unknown/Multiple Failure: None/Unknown | Difficulty: Unknown Testcase: | Blockedby: Blocking: | Related: --------------------------------------+------------------------------------- Changes (by goldfire): * status: new => closed * resolution: => invalid Comment: I have figured out a suitable workaround. Instead of using a type family application in a return type, just have the function return {{{[result]}}}. Then, use a type family to optionally create an equality constraint for {{{result}}}. {{{ type family MapOuttable (f :: *) (list :: [*]) (result :: *) :: Constraint type instance MapOuttable f '[] result = () type instance MapOuttable f '[elt] result = (Applicable f elt, result ~ Apply f elt) type instance MapOuttable f (h1 ': h2 ': t) result = ( Applicable f h1 , Apply f h1 ~ Apply f h2 , MapOuttable f (h2 ': t) result , result ~ Apply f h1 ) hMapOut :: MapOuttable f list a => f -> HList list -> [a] hMapOut _ HNil = [] hMapOut f (HCons elt HNil) = [apply f elt] hMapOut f (HCons h t@(HCons _ _)) = apply f h : hMapOut f t }}} Given this workaround -- which should always be available in the case I'm thinking of -- I will close the ticket. -- Ticket URL: http://hackage.haskell.org/trac/ghc/ticket/7812#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler