reflection-1.1: Reifies arbitrary terms into types that can be reflected back into terms

Portabilitynon-portable (rank-2 types, type families, scoped type variables)
MaintainerEdward Kmett <>
Safe HaskellSafe-Infered




Based on the Functional Pearl: Implicit Configurations paper by Oleg Kiselyov and Chung-chieh Shan.

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 reduces to using two combinators, reify and reflect.

 ghci> reify 6 (\p -> reflect p + reflect p) :: Int

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).


Reifying any term at the type level

class Reifies s a | s -> a whereSource


reflect :: p s -> aSource

reify :: a -> (forall s. Reifies s a => Proxy s -> w) -> wSource