reflection-1.2.0.1: Reifies arbitrary terms into types that can be reflected back into terms

Portabilitynon-portable
Stabilityexperimental
MaintainerEdward Kmett <ekmett@gmail.com>
Safe HaskellTrustworthy

Data.Reflection

Contents

Description

Reifies arbitrary terms at the type level. Based on the Functional Pearl: Implicit Configurations paper by Oleg Kiselyov and Chung-chieh Shan.

http://www.cs.rutgers.edu/~ccshan/prepose/prepose.pdf

The approach from the paper was modified to work with Data.Proxy and to cheat by using knowledge of GHC's internal representations by Edward Kmett and Elliott Hird.

Usage comes down to two combinators, reify and reflect.

>>> reify 6 (\p -> reflect p + reflect p)
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).

In addition, a simpler API is offered for working with singleton values such as a system configuration, etc.

Synopsis

Reflection

class Reifies s a | s -> a whereSource

Methods

reflect :: proxy s -> aSource

Recover a value inside a reify context, given a proxy for its reified type.

reify :: forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> rSource

Reify a value at the type level, to be recovered with reflect.

Given

class Given a whereSource

This is a version of Reifies that allows for only a single value.

This is easier to work with than Reifies and permits extended defaulting, but it only offers a single reflected value of a given type at a time.

Methods

given :: aSource

Recover the value of a given type previously encoded with give.

give :: forall a r. a -> (Given a => r) -> rSource

Reify a value into an instance to be recovered with given.

You should only give a single value for each type. If multiple instances are in scope, then the behavior is implementation defined.