[GHC] #11715: There's something fishy going on with Constraint
GHC
ghc-devs at haskell.org
Fri Mar 18 16:44:14 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):
In a phone conversation yesterday we also developed an alternative plan to
comment:5, namely '''make `Constraint` and `*` the same in Haskell'''.
Thus:
* `type Constraint = *`. So the two are the same even in source Haskell.
* A type sig like `f :: Int => Int` becomes kind-correct. But we can
still rejects it in `checkValidType`, in the same way that we reject
higher-rank types when that extension is not enabled.
Ditto `f :: Ord a -> Int`
'''Disadvantages'''
This signature for `f` is currently rejected as ill-kinded:
{{{
type family F a :: Constraint
type instance F Int = Ord Bool
...
f :: F a -> a -- Currently ill-kinded
}}}
but would now be accepted, because `checkValidType` could not easily
reject it. More seriously
{{{
g :: F a => a -> a
}}}
would also be accepted even if `F` plainly returned types not constraints.
'''Advantages'''
* The proposal would eliminate the need for constraint tuples distinct
from ordinary value tuples, which would be good.
* If we were to silence `checkValidType` (with a language extension), it
would also allow functions like
{{{
reify :: c => c
with :: c -> (c => r) -> r
}}}
which allow you to get a dictionary as a value, and use it elsewhere.
Currently this requires the "Dict trick":
{{{
data Dict c where
Dict :: c => Dict c
reifyD :: c => Dict c
reifyD = Ditc
withD :: Dict c -> (c => r) -> r
withD Dict k = k
}}}
but the Dict trick actually does boxing and unboxing because it involves
a `data` type. It would be more direct not to require this.
* Another example: perhaps `TypeRep a` (the type) and `Typeable a` (the
constraint) could be the same thing. Thus
{{{
f :: TypeRep a => TypeRep b -> blah
}}}
would mean that the first arg was passed implicitly and the second
implicitly.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11715#comment:9>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list