Portability | non-portable |
---|---|

Stability | experimental |

Maintainer | Edward Kmett <ekmett@gmail.com> |

Safe Haskell | Trustworthy |

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`

.

`>>>`

12`reify 6 (\p -> reflect p + reflect p)`

The argument passed along by reify is just a `data `

, 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 `Proxy`

t =
Proxy`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.

- class Reifies s a | s -> a where
- reflect :: proxy s -> a

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