Refl package:reflection

Reifies arbitrary terms at the type level. Based on the Functional Pearl: Implicit Configurations paper by Oleg Kiselyov and Chung-chieh Shan. http://okmij.org/ftp/Haskell/tr-15-04.pdf The approach from the paper was modified to work with Data.Proxy and to cheat by using knowledge of GHC's internal representations by Edward Kmett and Elliott Hird. Usage comes down to two combinators, reify and reflect.
>>> reify 6 (\p -> reflect p + reflect p)
12
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). In addition, a simpler API is offered for working with singleton values such as a system configuration, etc.
Reifies arbitrary terms into types that can be reflected back into terms This package addresses the configuration problem which is propagating configurations that are available at run-time, allowing multiple configurations to coexist without resorting to mutable global variables or System.IO.Unsafe.unsafePerformIO. That package is an implementation of the ideas presented in the paper "Functional Pearl: Implicit Configurations" by Oleg Kiselyov and Chung-chieh Shan (original paper). However, the API has been streamlined to improve performance. There are a handful of tutorials on how to use this library:
Recover a value inside a reify context, given a proxy for its reified type.