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

Version on this page:2.1.4
LTS Haskell 22.26:2.1.8
Stackage Nightly 2024-06-21:2.1.8
Latest on Hackage:2.1.8

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-2.1.4@sha256:fbdfe95dcbe7c2fe19e1e62664d7ab4b432b8685e310cb3f0da621d936e05b56,3513

Module documentation for 2.1.4


Hackage 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


2.1.4 [2018.07.02]

  • Allow building with GHC 8.6.

2.1.3 [2018.01.18]

  • Add Semigroup instance for ReflectedMonoid.


  • Support cross-compilation and unregistered GHC builds.

  • Fixed typos in the documentation.


  • Fixed support for GHC 7.0


  • Added ReifiedMonoid and ReifiedApplicative.


  • Added reifyNat and reifySymbol for GHC 7.8+, capable of reflecting into the KnownNat and KnownSymbol classes respectively for use with other APIs.
  • Back-ported reifyTypeable from lens. This enables us to perform a (less efficient) form of Typeable reflection.


  • Renamed the flag for disabling the use of template-haskell, to -f-template-haskell for consistency with my other packages.

  • Builds warning-free on GHC 7.10.
  • Added a dynamic FromJSON example.

  • Updated the link to the paper.
  • More examples.


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