# 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

Usage reduces to using two combinators.

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

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

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.

[Index]