reflection
Version 0.8 revision 0 uploaded by EdwardKmett.
Package meta
- Synopsis
- Functional Pearl: Implicit Configurations
- Description
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
andTypeFamilies
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 (Seeexamples/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 aStablePtr
to anIntPtr
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
andReifiedNums
.Since we have so many fewer classes now,
Data.Reflection.Internal
was merged back intoData.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 asReifiesStorable
.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 aProxy
.
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.
- Author
- Edward A. Kmett, Oleg Kiselyov and Chung-chieh Shan
- Bug reports
- n/a
- Category
- Data, Reflection, Dependent Types
- Copyright
- 2009 Edward A. Kmett, 2004 Oleg Kiselyov and Chung-chieh Shan
- Homepage
- http://www.cs.rutgers.edu/~ccshan/prepose/prepose.pdf
- Maintainer
- Edward A. Kmett <ekmett@gmail.com>
- Package URL
- n/a
- Stability
- experimental