[GHC] #11715: There's something fishy going on with Constraint
GHC
ghc-devs at haskell.org
Thu Mar 17 08:53:50 UTC 2016
#11715: There's something fishy going on with Constraint
-------------------------------------+-------------------------------------
Reporter: bgamari | Owner:
Type: bug | Status: new
Priority: high | Milestone: 8.0.1
Component: Compiler (Type | Version: 8.0.1-rc1
checker) |
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by simonpj):
Indeed; see this (in `Kind.hs`)
{{{
Note [Kind Constraint and kind *]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The kind Constraint is the kind of classes and other type constraints.
The special thing about types of kind Constraint is that
* They are displayed with double arrow:
f :: Ord a => a -> a
* They are implicitly instantiated at call sites; so the type inference
engine inserts an extra argument of type (Ord a) at every call site
to f.
However, once type inference is over, there is *no* distinction between
Constraint and *. Indeed we can have coercions between the two. Consider
class C a where
op :: a -> a
For this single-method class we may generate a newtype, which in turn
generates an axiom witnessing
C a ~ (a -> a)
so on the left we have Constraint, and on the right we have *.
See Trac #7451.
Bottom line: although '*' and 'Constraint' are distinct TyCons, with
distinct uniques, they are treated as equal at all times except
during type inference.
}}}
This is a true wart, which I have always longed to expunge.
And actually, now we heterogeneous equalities, maybe we can!! Perhaps we
could have
{{{
newtype C a :: Constraint = MkC (a->a) -- Not legal source code
}}}
leading to an axiom
{{{
axC :: forall (a:*). (C a :: Constraint) ~R (a->a :: *)
}}}
That is, `*` and `Constraint` both classify values, but different kinds of
values. Is that ok?
Or, I suppose we could say
{{{
type Constraint = TYPE ConstraintRep
}}}
That would be even better, because we can certainly have `Ord a -> a` (at
least in Core), and even `((->) (Ord a))`.
Does that seem plausible? I like it.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11715#comment:5>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list