The reflection package

This package provides an implementation of the ideas presented in the paper
Functional Pearl: Implicit Configurations by Oleg Kiselyov and
Chung-chieh Shan. However, the API has been modified to use only
one extension: Rank2Types

The argument passed along by reify is just a data Proxy t = Proxy, so all of the
information needed to reconstruct your value has been moved to the type level.
This enables it to be used when constructing instances (See examples/Monoid.hs).
An additional combinator that may be more useful when building instances is also
supplied.

reflectT :: Reified s => p s a -> a

Changes in 0.7:

Uses a much simpler construction where reify now converts a StablePtr to an
IntPtr and reifies that directly as an integral type rather than serializing
and storing the StablePtr as a list of bytes as proposed in the original paper.

Removed ReifiedStorable and ReifiedNums.

Since we have so many fewer classes now, Data.Reflection.Internal was merged back
into Data.Reflection

Changes in 0.6:

Removed the dependency on multiparameter type classes, functional
dependencies, and flexible instances, by making Reifies a single
parameter type class in the same fashion as ReifiesStorable.

Moved the building blocks to Data.Reflection.Internal to reduce API clutter.

Added reflectT

Changes in 0.5:

Generalized the type signatures in reflect to allow you to pass any type
with kind * -> * wrapped around the desired type as the phantom type
argument rather than just a Proxy.

Changes in 0.4:

Converted from Data.Tagged to using Data.Proxy for reflection. This
reduces the need for helper functions and scoped type variables in user
code.