The approach from the paper was modified to work with Data.Proxy
and to cheat by using knowledge of GHC's internal representations
by Edward Kmett and Elliott Hird.
Usage comes down to two combinators, reify and reflect.
Example1 expression
>>> reify 6 (\p -> reflect p + reflect p)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).
In addition, a simpler API is offered for working with singleton
values such as a system configuration, etc.
This can be used to generate a template haskell splice for a type level version of a given int.
This does not use GHC TypeLits, instead it generates a numeric type by hand similar to the ones used
in the "Functional Pearl: Implicit Configurations" paper by Oleg Kiselyov and Chung-Chieh Shan.
instance Num (Q Exp) provided in this package allows writing $(3)
instead of $(int 3).
This is a restricted version of int that can only generate natural numbers. Attempting to generate
a negative number results in a compile time error. Also the resulting sequence will consist entirely of
Z, D, and SD constructors representing the number in zeroless binary.
Fold a value using its Foldable instance using
explicitly provided Monoid operations. This is like foldMap
where the Monoid instance can be manually specified.
Fold a value using its Foldable instance using
explicitly provided Monoid operations. This is like fold
where the Monoid instance can be manually specified.
Traverse a container using its Traversable instance using
explicitly provided Applicative operations. This is like traverse
where the Applicative instance can be manually specified.
Sequence a container using its Traversable instance using
explicitly provided Applicative operations. This is like sequence
where the Applicative instance can be manually specified.