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 Rank2Types and TypeFamilies and the implementation has been streamlined to improve performance.

The original paper can be obtained from

Changes in 0.9:

  • Faster internal implementation.

  • Removed ReifiedNum, reflectNum, and reifyIntegral; reify and reflect are considerably faster than the special case combinators were.

Changes in 0.8:

  • Switched to using type families to avoid a problem where the user could cast Proxy (s a) -> Proxy (s b) and get back a values with the wrong type under the API in effect from 0.6. This API yields a much nicer example as well.

  • Removed reflectT as it no longer makes sense.

  • Added a more advanced example example/Constraints.hs using constraint kinds.

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.

[Skip to Readme]




Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

Package maintainers

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, 2.1.7
Dependencies base (>=4.4 && <5), tagged (>=0.2.3 && <0.3) [details]
License BSD-3-Clause
Copyright 2009-2012 Edward A. Kmett, 2012 Elliott Hird, 2004 Oleg Kiselyov and Chung-chieh Shan
Author Edward A. Kmett, Oleg Kiselyov and Chung-chieh Shan
Maintainer Edward A. Kmett <>
Revised Revision 1 made by HerbertValerioRiedel at 2016-01-03T09:21:16Z
Category Data, Reflection, Dependent Types
Home page
Source repo head: git clone git://
Uploaded by EdwardKmett at 2012-04-07T08:04:08Z
Distributions Arch:2.1.7, Debian:2.1.6, Fedora:2.1.7, FreeBSD:2, LTSHaskell:2.1.7, NixOS:2.1.7, Stackage:2.1.7, openSUSE:2.1.7
Reverse Dependencies 92 direct, 7584 indirect [details]
Downloads 210890 total (324 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]

Readme for reflection-0.9

[back to package description]

This package provides an implementation of the ideas presented in the paper

  Oleg Kiselyov and Chung-Chieh Shan, "Functional Pearl: Implicit Configurations"

However, the API has been modified to use @Rank2Types@ and @TypeFamilies@ and the
implementation has been streamlined to improve performance.