[GHC] #16070: Better inferred signatures

GHC ghc-devs at haskell.org
Wed Dec 19 12:27:56 UTC 2018


#16070: Better inferred signatures
-------------------------------------+-------------------------------------
           Reporter:  simonpj        |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.6.3
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 Consider this (taken from [https://github.com/ghc-proposals/ghc-
 proposals/pull/158#issuecomment-448549030 here])
 {{{
 class FieldType x r ~ a => HasField (x :: k) r  a where
   type FieldType x r
   getField :: r -> a
   setField :: r -> a -> r

 f r = setField @"bar" r (getField @"foo" r)
 }}}
 We get this type inferred for `f`:
 {{{
   f :: forall r.
        (HasField "bar" r (FieldType "bar" r),
         HasField "foo" r (FieldType "bar" r))
      => r -> r
 }}}
 But actually this signature is equivalent
 {{{
   f :: forall r a.
        (HasField "bar" r a, HasField "foo" r a)
      => r -> r
 }}}
 and it's quite a bit shorter.  Similarly, from this definition
 {{{
 g r = setField r
 }}}
 We get this inferred type
 {{{
   g :: forall r p.
        HasField "bar" r (FieldType "bar" r)
     => p -> r -> FieldType "bar" r -> r
 }}}
 where again we might prefer
 {{{
   g :: forall r a. HasField "bar" r a => r -> a -> r
 }}}
 '''Question''': could we make GHC infer the briefer types?

 After all, it does some similar abbreviation with type classes.  Where we
 could
 infer `(Ord a, Eq a)` we collapse out the `Eq a` and just infer the
 context
 `(Ord a)`.

 There is nothing record-specific about this ticket. It's just about using
 inferred equality constraints to simplify the inferred signature.

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


More information about the ghc-tickets mailing list