-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | 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 only one extension: Rank2Types
--
-- Usage reduces to using two combinators.
--
--
-- reify :: a -> (forall s. Reified s => Proxy (s a) -> w) -> w
-- reflect :: Reified s => p (s a) -> a
--
--
--
-- ghci> 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). An
-- additional combinator that may be more useful when building instances
-- is also supplied.
--
--
-- reflectT :: Reified s => p s a -> a
--
--
-- 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.
-- - 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 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.
--
@package reflection
@version 0.7
-- | Based on the Functional Pearl: Implicit Configurations paper by Oleg
-- Kiselyov and Chung-chieh Shan.
--
-- http://www.cs.rutgers.edu/~ccshan/prepose/prepose.pdf
--
-- Modified to minimize extensions and work with Data.Proxy rather than
-- explicit scoped type variables and undefined values by Edward Kmett.
module Data.Reflection
class Reified s
reflect :: Reified s => p (s a) -> a
reify :: a -> (forall s. Reified s => Proxy (s a) -> w) -> w
reflectT :: Reified s => t s a -> a
class ReifiedNum s
reflectNum :: (ReifiedNum s, Num a) => proxy s -> a
reifyIntegral :: Integral a => a -> (forall s. ReifiedNum s => Proxy s -> w) -> w
instance Show Zero
instance Show (Twice s)
instance Show (SuccTwice s)
instance Show (PredTwice s)
instance ReifiedNum s => Reified (Stable s)
instance ReifiedNum s => ReifiedNum (PredTwice s)
instance ReifiedNum s => ReifiedNum (SuccTwice s)
instance ReifiedNum s => ReifiedNum (Twice s)
instance ReifiedNum Zero