reflection: Functional Pearl: Implicit Configurations
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
and
TypeFamilies
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 (See examples/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 usingData.Proxy
for reflection. This reduces the need for helper functions and scoped type variables in user code.
Downloads
- reflection-0.8.tar.gz [browse] (Cabal source package)
- Package description (as included in the package)
Maintainer's Corner
For package maintainers and hackage trustees
Candidates
- No Candidates
Versions [RSS] | 0.0.0, 0.1.0, 0.1.1, 0.2.0, 0.3.0, 0.3.1, 0.3.2, 0.3.3, 0.3.5, 0.4.0, 0.4.0.1, 0.4.0.2, 0.4.1, 0.4.1.1, 0.5, 0.5.0.1, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.1.1, 1.1.2, 1.1.3, 1.1.4, 1.1.5, 1.1.5.1, 1.1.6, 1.1.7, 1.2.0.1, 1.3, 1.3.1, 1.3.2, 1.4, 1.5.1, 1.5.1.1, 1.5.1.2, 1.5.2, 1.5.2.1, 2, 2.1, 2.1.1, 2.1.1.1, 2.1.2, 2.1.3, 2.1.4, 2.1.5, 2.1.6, 2.1.7, 2.1.8, 2.1.9 |
---|---|
Dependencies | base (>=4 && <5), tagged (>=0.2.3 && <0.3) [details] |
License | BSD-3-Clause |
Copyright | 2009 Edward A. Kmett, 2004 Oleg Kiselyov and Chung-chieh Shan |
Author | Edward A. Kmett, Oleg Kiselyov and Chung-chieh Shan |
Maintainer | Edward A. Kmett <ekmett@gmail.com> |
Category | Data, Reflection, Dependent Types |
Home page | http://www.cs.rutgers.edu/~ccshan/prepose/prepose.pdf |
Source repo | head: git clone git://github.com/ekmett/reflection.git |
Uploaded | by EdwardKmett at 2012-04-07T04:16:02Z |
Distributions | Arch:2.1.8, Debian:2.1.6, Fedora:2.1.8, FreeBSD:2, LTSHaskell:2.1.9, NixOS:2.1.8, Stackage:2.1.9, openSUSE:2.1.9 |
Reverse Dependencies | 97 direct, 7998 indirect [details] |
Downloads | 217920 total (15 in the last 30 days) |
Rating | 2.25 (votes: 2) [estimated by Bayesian average] |
Your Rating | |
Status | Docs uploaded by user Build status unknown [no reports yet] |