reflection: Reifies arbitrary terms into types that can be reflected back into terms
This package addresses the configuration problem which is
propogating configurations that are available at run-time, allowing
multible configurations to coexist without resorting to mutable
global variables or System.IO.Unsafe.unsafePerformIO
.
An example is modular arithmetic where the modulus itself can be supplied at run-time:
foo :: Modular s => Modulus s foo = 1000 * 1000 * 5 + 2000
>>>
withModulus 1280 foo
1040
given the following setup:
{-# LANGUAGE ScopedTypeVariables, RankNTypes, ConstraintKinds, FlexibleContexts, UndecidableInstances 125; import Data.Proxy (Proxy(Proxy)) import Data.Reflection (Reifies, reflect, reify)
and definitions:
data Modulus s = M { getModulus :: Integer } type Modular s =Data.Reflection.Reifies
s Integer normalize :: forall s. Modular s => Integer -> Modulus s normalize n = M (mod n modulus) where modulus =Data.Reflection.reflect
(Data.Proxy.Proxy
::Data.Proxy.Proxy
s) instance Modular s => Num (Modulus s) where M a + M b = normalize (a + b) M a * M b = normalize (a * b) withModulus :: Integer -> (forall s. Modular s => Modulus s) -> Integer withModulus m v =Data.Reflection.reify
m (getModulus . asProxyOf v) where asProxyOf :: f s -> Proxy s -> f s asProxyOf = const
That package is an implementation of the ideas presented in the paper "Functional Pearl: Implicit Configurations" by Oleg Kiselyov and Chung-chieh Shan (original paper). However, the API has been streamlined to improve performance.
Austin Seipp's tutorial Reflecting values to types and back provides a summary of the approach taken by this library, along with more motivating examples.
[Skip to Readme]
Flags
Manual Flags
Name | Description | Default |
---|---|---|
th | Enabled |
Automatic Flags
Name | Description | Default |
---|---|---|
slow | Disabled |
Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info
Downloads
- reflection-1.5.1.2.tar.gz [browse] (Cabal source package)
- Package description (revised from the package)
Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.
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 |
---|---|
Change log | CHANGELOG.markdown |
Dependencies | base (>=2 && <4.12), tagged (>=0.4.4 && <1), template-haskell [details] |
License | BSD-3-Clause |
Copyright | 2009-2013 Edward A. Kmett, 2012 Elliott Hird, 2004 Oleg Kiselyov and Chung-chieh Shan |
Author | Edward A. Kmett, Elliott Hird, Oleg Kiselyov and Chung-chieh Shan |
Maintainer | Edward A. Kmett <ekmett@gmail.com> |
Revised | Revision 1 made by phadej at 2018-09-24T16:48:51Z |
Category | Data, Reflection, Dependent Types |
Home page | http://github.com/ekmett/reflection |
Bug tracker | http://github.com/ekmett/reflection/issues |
Source repo | head: git clone git://github.com/ekmett/reflection.git |
Uploaded | by EdwardKmett at 2015-03-08T09:08:45Z |
Distributions | Arch:2.1.6, Debian:2.1.6, Fedora:2.1.6, FreeBSD:2, LTSHaskell:2.1.6, NixOS:2.1.6, Stackage:2.1.6, openSUSE:2.1.6 |
Downloads | 205589 total (572 in the last 30 days) |
Rating | 2.25 (votes: 2) [estimated by Bayesian average] |
Your Rating | |
Status | Docs available [build log] Last success reported on 2015-03-08 [all 1 reports] |