lens-4.2: Lenses, Folds and Traversals

Copyright2009-2014 Edward Kmett, 2012 Elliott Hird, 2004 Oleg Kiselyov and Chung-chieh Shan
LicenseBSD3
MaintainerEdward Kmett <ekmett@gmail.com>
Stabilityexperimental
Portabilitynon-portable
Safe HaskellTrustworthy
LanguageHaskell98

Control.Lens.Internal.Reflection

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 streamline the API 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).

This version is based on the "slow" path from the reflection package, but modified to work with the same Reifies class as is provided by the "fast" path, and to make sure the parameter is Typeable.

This is necessary to work around the changes to Data.Typeable in GHC HEAD.

Synopsis

Documentation

class Reifies s a | s -> a where

Methods

reflect :: proxy s -> a

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

Instances

Reifies * Z Int 
Reifies * n Int => Reifies * (D n) Int 
Reifies * n Int => Reifies * (SD n) Int 
Reifies * n Int => Reifies * (PD n) Int 

reifyTypeable :: Typeable a => a -> (forall s. (Typeable s, Reifies s a) => Proxy s -> r) -> r Source

Reify a value at the type level in a Typeable-compatible fashion, to be recovered with reflect.