reflection: Functional Pearl: Implicit Configurations

[ bsd3, data, dependent-types, library, reflection ] [ Propose Tags ]

This package provides an implementation of the ideas presented in the paper "Functional Pearl: Implicit Configurations" by Oleg Kiselyov and Chung-chieh Shan. However, the API has been modified to use only one extension: Rank2Types

Usage reduces to using two combinators.

reify :: a -> (forall s. Reified s => Proxy (s a) -> w) -> w
reflect :: Reified s => p (s a) -> a
ghci> reify 6 (\p -> reflect p + reflect p)

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). An additional combinator that may be more useful when building instances is also supplied.

reflectT :: Reified s => p s a -> a

Changes in 0.7:

  • Uses a much simpler construction where reify now converts a StablePtr to an IntPtr and reifies that directly as an integral type rather than serializing and storing the StablePtr as a list of bytes as proposed in the original paper.

  • Removed ReifiedStorable and ReifiedNums.

  • Since we have so many fewer classes now, Data.Reflection.Internal was merged back into Data.Reflection

Changes in 0.6:

  • Removed the dependency on multiparameter type classes, functional dependencies, and flexible instances, by making Reifies a single parameter type class in the same fashion as ReifiesStorable.

  • Moved the building blocks to Data.Reflection.Internal to reduce API clutter.

  • Added reflectT

Changes in 0.5:

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

Changes in 0.4:

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




Maintainer's Corner

For package maintainers and hackage trustees


  • No Candidates
Versions [RSS] 0.0.0, 0.1.0, 0.1.1, 0.2.0, 0.3.0, 0.3.1, 0.3.2, 0.3.3, 0.3.5, 0.4.0,,, 0.4.1,, 0.5,, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.1.1, 1.1.2, 1.1.3, 1.1.4, 1.1.5,, 1.1.6, 1.1.7,, 1.3, 1.3.1, 1.3.2, 1.4, 1.5.1,,, 1.5.2,, 2, 2.1, 2.1.1,, 2.1.2, 2.1.3, 2.1.4, 2.1.5, 2.1.6
Dependencies base (>=4 && <5), tagged (>=0.2.3 && <0.3) [details]
License BSD-3-Clause
Copyright 2009 Edward A. Kmett, 2004 Oleg Kiselyov and Chung-chieh Shan
Author Edward A. Kmett, Oleg Kiselyov and Chung-chieh Shan
Maintainer Edward A. Kmett <>
Category Data, Reflection, Dependent Types
Home page
Source repo head: git clone git://
Uploaded by EdwardKmett at 2012-04-07T00:56:12Z
Distributions Arch:2.1.6, Debian:2.1.6, Fedora:2.1.6, FreeBSD:2, LTSHaskell:2.1.6, NixOS:2.1.6, Stackage:2.1.6, openSUSE:2.1.6
Downloads 205589 total (572 in the last 30 days)
Rating 2.25 (votes: 2) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]