-- 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.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.6
-- | 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.Internal
class Reified s
reflect :: Reified s => proxy (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
class ReifiedNums ss
reflectNums :: (ReifiedNums ss, Num a) => proxy ss -> [a]
reifyIntegrals :: Integral a => [a] -> (forall ss. ReifiedNums ss => Proxy ss -> w) -> w
class ReifiedStorable s
reflectStorable :: (ReifiedStorable s, Storable a) => proxy (s a) -> a
reifyStorable :: Storable a => a -> (forall s. ReifiedStorable s => Proxy (s a) -> w) -> w
instance Show Zero
instance Show (Twice s)
instance Show (Succ s)
instance Show (Pred s)
instance ReifiedStorable s => Reified (Stable s)
instance Unused (Stable s a)
instance ReifiedNums s => ReifiedStorable (Store s)
instance Unused (Store s a)
instance (ReifiedNum s, ReifiedNums ss) => ReifiedNums (Cons s ss)
instance ReifiedNums Nil
instance Unused (Cons s ss)
instance Unused Nil
instance ReifiedNum s => ReifiedNum (Pred s)
instance ReifiedNum s => ReifiedNum (Succ s)
instance ReifiedNum s => ReifiedNum (Twice s)
instance ReifiedNum Zero
instance Unused (Pred s)
instance Unused (Succ s)
instance Unused (Twice s)
instance Unused Zero
-- | 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 => proxy (s a) -> a
reflectT :: Reified s => t s a -> a
reify :: a -> (forall s. Reified s => Proxy (s a) -> w) -> w