-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Reifies arbitrary terms into types that can be reflected back into terms -- -- 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 streamlined to improve -- performance. -- -- The original paper can be obtained from -- http://www.cs.rutgers.edu/~ccshan/prepose/prepose.pdf. @package reflection @version 1.2.0.1 -- | Reifies arbitrary terms at the type level. Based on the Functional -- Pearl: Implicit Configurations paper by Oleg Kiselyov and Chung-chieh -- Shan. -- -- http://www.cs.rutgers.edu/~ccshan/prepose/prepose.pdf -- -- 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. -- --
-- >>> 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. module Data.Reflection class Reifies s a | s -> a reflect :: Reifies s a => proxy s -> a -- | Reify a value at the type level, to be recovered with reflect. reify :: a -> (forall s. Reifies s a => Proxy s -> r) -> r -- | This is a version of Reifies that allows for only a single -- value. -- -- This is easier to work with than Reifies and permits extended -- defaulting, but it only offers a single reflected value of a given -- type at a time. class Given a given :: Given a => a -- | Reify a value into an instance to be recovered with given. -- -- You should only give a single value for each type. If multiple -- instances are in scope, then the behavior is implementation defined. give :: a -> (Given a => r) -> r