[GHC] #10086: Disambiguate type variables using dictionaries

GHC ghc-devs at haskell.org
Fri Feb 13 13:41:50 UTC 2015


#10086: Disambiguate type variables using dictionaries
-------------------------------------+-------------------------------------
              Reporter:  jstolarek   |             Owner:
                  Type:  feature     |            Status:  new
  request                            |         Milestone:
              Priority:  normal      |           Version:  7.11
             Component:  Compiler    |  Operating System:  Unknown/Multiple
  (Type checker)                     |   Type of failure:  Other
              Keywords:              |        Blocked By:
          Architecture:              |   Related Tickets:
  Unknown/Multiple                   |
             Test Case:              |
              Blocking:              |
Differential Revisions:              |
-------------------------------------+-------------------------------------
 Consider this code:

 {{{#!hs
 type family TF t
 type instance TF (Maybe a) = Maybe a

 class Id f where
     idTF :: TF f -> TF f

 instance Id (Maybe a) where
     idTF x = x

 g = idTF (Just 'c')
 }}}

 Definition of `g` is rejected due to ambiguity:

 {{{
 Couldn't match expected type ‘TF f0’ with actual type ‘Maybe Char’
 The type variable ‘f0’ is ambiguous
 Relevant bindings include g :: TF f0 (bound at T6018.hs:18:1)
 In the first argument of ‘idTF’, namely ‘(Just 'c')’
 In the expression: idTF (Just 'c')
 }}}

 There are two ways to proceed:

 1. Introduce `Proxy` argument and disambiguate `f` with explicit type
 annotation.

 2. With injective type families (coming Real Soon Now) we can declare `TF`
 as injective and this code will compile. That obviously won't work if `TF`
 is not injective.

 I think we could do better here. `idTF` is a type class function and when
 it is called GHC uses a concrete implementation from a dictionary. But
 notice that if we have the dictionary we could equally well use it to
 disambiguate `f`. In this example we call `idTF` with a `Maybe Char`
 argument, which means we are using `Id (Maybe a)` instance. Knowing this
 we could infer that `f` is `Maybe a`.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10086>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list