The reflection package
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 a StablePtr to an IntPtr 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 and ReifiedNums.
Since we have so many fewer classes now, Data.Reflection.Internal was merged back into Data.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 as ReifiesStorable.
Moved the building blocks to Data.Reflection.Internal to reduce API clutter.
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 a Proxy.
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.
|Versions||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, 188.8.131.52, 1.1.6, 1.1.7, 184.108.40.206, 1.3, 1.3.1, 1.3.2, 1.4, 1.5.1, 220.127.116.11, 18.104.22.168, 1.5.2, 22.214.171.124, 2, 2.1, 2.1.1, 126.96.36.199|
|Change log||None available|
|Dependencies||base (==4.*), tagged (>=0.2.3 && <0.3) [details]|
|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 <email@example.com>|
|Category||Data, Reflection, Dependent Types|
|Source repository||head: git clone git://github.com/ekmett/reflection.git|
|Uploaded||Sat Apr 7 04:16:02 UTC 2012 by EdwardKmett|
|Distributions||Arch:188.8.131.52, Debian:184.108.40.206, Fedora:1.5.1, FreeBSD:2, LTSHaskell:220.127.116.11, NixOS:18.104.22.168, Stackage:22.214.171.124|
|Downloads||94854 total (294 in last 30 days)|
|Status||Docs uploaded by user|
Build status unknown [no reports yet]
For package maintainers and hackage trustees