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

Version on this page:2.1.7@rev:1
LTS Haskell 22.28:2.1.8
Stackage Nightly 2024-07-13: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.7@sha256:f2b5b3f0983a605d16e53af489ebba62967d2c80353473ca66cc1734222b3a04,4518

Module documentation for 2.1.7


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.7 [2023.02.28]

  • When building with base-4.18 (GHC 9.6) or later, implement reifyNat and reifySymbol using the API provided by GHC.TypeLits instead of resorting to unsafeCoerce.

2.1.6 [2020.05.16]

  • Fix a bug in which give (and possibly reify, reifyNat, and reifySymbol) could be unsoundly inlined by GHC 8.10 or older to produce incorrect runtime results.

2.1.5 [2019.08.27]

  • Fix a bug in which reifyNat would yield incorrect results for very large Integers on GHC 8.2 or later.

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.