Reifies arbitrary terms into types that can be reflected back into terms

Version on this page:1.5.1@rev:1
LTS Haskell 19.18:2.1.6@rev:1
Stackage Nightly 2022-08-04:2.1.6@rev:1
Latest on Hackage:2.1.6@rev:1

See all snapshots reflection appears in

BSD-3-Clause licensed by Edward A. Kmett, Elliott Hird, Oleg Kiselyov and Chung-chieh Shan
Maintained by Edward A. Kmett
This version can be pinned in stack with:reflection-1.5.1@sha256:e8e75f352da74b9f7a86231550e3c5046a41d4253658520fd476da533245af9c,2585

Module documentation for 1.5.1

  • Data
    • Data.Reflection
Used by 3 packages in lts-0.7(full list with versions):


Build Status

This package provides an implementation of the ideas presented in Functional Pearl: Implicit Configurations by Oleg Kiselyov and Chung-Chieh Shan. However, the API has been implemented in a much more efficient manner.

Contact Information

Contributions and bug reports are welcome!

Please feel free to contact me through github or on the #haskell IRC channel on

-Edward Kmett



  • We no longer export Show (Q a) for GHC >= 7.4. This was causing random hangs when users tried to somehow run declaration splices from the REPL.
  • We no longer depend on tagged for GHC >= 7.8, since Proxy is now in base.


  • Added a flag to disable template-haskell support for GHC stage1 platforms.
  • Added instances of Reifies for GHC.TypeLits


  • Changed the behavior of the $(1) template haskell splices for Exp to use a Proxy rather than value-level numbers. This is more consistent with the role of this libraary and the other could always be generated via sa splice anyways.


  • Added a workaround for changes in the behavior of the internal ‘Magic’ datatype under the current GHC PolyKinds implementation.


  • Merged some functionality from Data.Analytics.Reflection. Notably the ability to use type nats to reflect numbers, and to splice numbers directly. This reduces orphan instances somewhat.


  • Added Given and give.


  • Fixed an issue caused by changes in GHC 7.7’s typechecker by using explicit ScopedTypeVariables.


  • Relaxed an unnecessary strictness annotation in the fast implementation


  • Both implementations now work on Hugs; the fast implementation ascends from the ranks of completely unportable black magic to being merely /mostly/ unportable black magic.

From 0.5 to 1.1:

  • Much faster implementation available that is about 50 /times/ faster than 0.9 and which runs purely on black magic. This version is now used by default. To turn it off install with the slow flag. If you encounter a problem with the implementation, please contact the author.
  • Removed ReifiedNum, reflectNum, and reifyIntegral; reify and reflect are about 3 orders of magnitude faster than the special case combinators were.


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


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