[GHC] #12647: Can't capture improvement of functional dependencies

GHC ghc-devs at haskell.org
Fri Sep 30 19:30:13 UTC 2016


#12647: Can't capture improvement of functional dependencies
-------------------------------------+-------------------------------------
           Reporter:  Iceland_jack   |             Owner:
               Type:  task           |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  None           |           Version:  8.0.1
           Keywords:                 |  Operating System:  Unknown/Multiple
  FunctionalDependencies             |
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 [http://www.diku.dk/~paba/pubs/files/serrano15haskell-paper.pdf Type
 Families with Class, Type Classes with Family] discusses
 [https://gist.github.com/Icelandjack/5afdaa32f41adf3204ef9025d9da2a70#pdf-
 instance-improvement instance improvement] with the example

 {{{#!hs
 class Collection c e | c -> e where
   empty :: c
   add   :: e -> c -> c

 instance Collection [a] a where
   empty :: [a]
   empty = []

   add :: a -> [a] -> [a]
   add = (:)
 }}}

 I wondered how to express that `x ~ Int` can be deduced from `Collection
 [Int] x` using improvement, I first attempted using the
 [https://hackage.haskell.org/package/constraints constraints] machinery:

 {{{#!hs
 data Dict c where
   Dict :: c => Dict c

 newtype a :- b = Sub (a => Dict b)
 }}}

 but I'm not able to construct a term of type `Collection [Int] x :- (Int ~
 x)` proving that `Collection [Int] x` entails `Int ~ x`:

 {{{
 ghci> Sub Dict :: Collection [Int] x :- (Int ~ x)

 <interactive>:52:5: error:
     • Couldn't match type ‘x1’ with ‘Int’ arising from a use of ‘Dict’
       ‘x1’ is a rigid type variable bound by
         an expression type signature:
           forall x1. Collection [Int] x1 :- Int ~ x1
         at <interactive>:52:13
     • In the first argument of ‘Sub’, namely ‘Dict’
       In the expression: Sub Dict :: Collection [Int] x :- (Int ~ x)
       In an equation for ‘it’:
           it = Sub Dict :: Collection [Int] x :- (Int ~ x)
 }}}

 Is this due to overlapping instances or something?

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


More information about the ghc-tickets mailing list