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

Version on this page:2.1.4
LTS Haskell 13.21:2.1.4
Stackage Nightly 2019-05-18:2.1.4
Latest on Hackage:2.1.4

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

Module documentation for 2.1.4

There are no documented modules for this package.


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.
comments powered byDisqus