[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