[GHC] #9429: Alternative to type family Any
GHC
ghc-devs at haskell.org
Sun Aug 10 11:08:00 UTC 2014
#9429: Alternative to type family Any
-------------------------------------+-------------------------------------
Reporter: mboes | Owner:
Type: feature | Status: new
request | Milestone:
Priority: normal | Version: 7.9
Component: Compiler | Keywords:
Resolution: | Architecture: Unknown/Multiple
Operating System: | Difficulty: Unknown
Unknown/Multiple | Blocked By:
Type of failure: | Related Tickets: 9097, 9380
None/Unknown |
Test Case: |
Blocking: |
Differential Revisions: |
-------------------------------------+-------------------------------------
Description changed by mboes:
Old description:
> In GHC HEAD, `Any` is no longer a datatype. There are good reasons for
> this change, one of which was explained in #9097, the original ticket,
> and another in #9380. Unfortunately, a casualty of this change is that it
> is no longer easy to generalize the
> [https://hackage.haskell.org/package/rank1dynamic|rank1dynamic package]
> to rank-1 types with type variables of arbitrary kind (not just `*`). We
> submitted a way to do so [here], that exploits the fact that `Any` has
> the very magical property of inhabiting *all* kinds, including closed
> ones.
>
> This works for GHC 7.8, but won't work in HEAD, because we require that
> there exists a `Typeable` instance for `Any`, just as there are
> `Typeable` instances for any other type one wishes to have instances for.
> The reason is that now that `Any` is a type family, `Any` is no longer a
> legal instance head.
>
> There are several possible solutions that I see:
> * while it's clearly dangerous for the compiler to be inserting the old
> `Any` during typechecking from the moment that we have computation in
> types over closed kinds, we may still want the old `Any`, say under a
> different name, as a backdoor. It wouldn't be used by the compiler during
> type checking - only by packages such as rank1dynamic. I believe that
> furthermore, if we restrict the old `Any` to not inhabit closed kinds,
> then none of the problems cited in the above tickets arise.
> * Instead of making the new `Any` a type family, keep it a datatype, but
> ban it from inhabiting closed kinds. I don't know if such an `Any` would
> be sufficient for the purposes of GHC, however.
> * Hardwire a `Typeable` instance for the `Any` type family (not sure if
> this makes sense).
New description:
In GHC HEAD, `Any` is no longer a datatype. There are good reasons for
this change, one of which was explained in #9097, the original ticket, and
another in #9380. Unfortunately, a casualty of this change is that it is
no longer easy to generalize the
[https://hackage.haskell.org/package/rank1dynamic|rank1dynamic package] to
rank-1 types with type variables of arbitrary kind (not just `*`). We
submitted a way to do so [https://github.com/haskell-
distributed/rank1dynamic/pull/6|here], that exploits the fact that `Any`
has the very magical property of inhabiting *all* kinds, including closed
ones.
This works for GHC 7.8, but won't work in HEAD, because we require that
there exists a `Typeable` instance for `Any`, just as there are `Typeable`
instances for any other type one wishes to have instances for. The reason
is that now that `Any` is a type family, `Any` is no longer a legal
instance head.
There are several possible solutions that I see:
* while it's clearly dangerous for the compiler to be inserting the old
`Any` during typechecking from the moment that we have computation in
types over closed kinds, we may still want the old `Any`, say under a
different name, as a backdoor. It wouldn't be used by the compiler during
type checking - only by packages such as rank1dynamic. I believe that
furthermore, if we restrict the old `Any` to not inhabit closed kinds,
then none of the problems cited in the above tickets arise.
* Instead of making the new `Any` a type family, keep it a datatype, but
ban it from inhabiting closed kinds. I don't know if such an `Any` would
be sufficient for the purposes of GHC, however.
* Hardwire a `Typeable` instance for the `Any` type family (not sure if
this makes sense).
--
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9429#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list