reflection-0.9: Functional Pearl: Implicit Configurations

Portabilitynon-portable (rank-2 types, type families, scoped type variables)
Stabilityexperimental
MaintainerEdward Kmett <ekmett@gmail.com>
Safe HaskellSafe-Infered

Data.Reflection

Contents

Description

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 streamline the API by Edward Kmett and Elliott Hird.

Usage reduces to using two combinators, reify and reflect.

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

Synopsis

Reifying any term at the type level

class Reified s whereSource

Associated Types

type Reflected s Source

Methods

reflect :: p s -> Reflected sSource

Instances

(B b0, B b1, B b2, B b3, B b4, B b5, B b6, B b7) => Reified (Stable b0 b1 b2 b3 b4 b5 b6 b7 a) 

reify :: a -> (forall s. (Reified s, Reflected s ~ a) => Proxy s -> w) -> wSource