[GHC] #9429: Alternative to type family Any

GHC ghc-devs at haskell.org
Sun Aug 10 11:10:06 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 [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).

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:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list