-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Dependent sum type -- -- A dependent sum is a generalization of a particular way of thinking -- about the Either type. Either a b can be thought of -- as a 2-tuple (tag, value), where the value of the tag -- determines the type of the value. In particular, either tag = -- Left and value :: a or tag = Right and -- value :: b. -- -- This package allows you to define your own dependent sum types by -- using your own "tag" types. @package dependent-sum @version 0.4 module Data.GADT.Show -- | Show-like class for 1-type-parameter GADTs. GShow t => -- ... is equivalent to something like (forall a. Show (t a)) -- => .... The easiest way to create instances would probably be -- to write (or derive) an instance Show (T a), and then simply -- say: -- --
--   instance GShow t where gshowsPrec = showsPrec
--   
class GShow t gshowsPrec :: GShow t => Int -> t a -> ShowS gshows :: GShow t => t a -> ShowS gshow :: (GShow t) => t a -> String newtype GReadResult t GReadResult :: (forall b. (forall a. t a -> b) -> b) -> GReadResult t [getGReadResult] :: GReadResult t -> forall b. (forall a. t a -> b) -> b -- | GReadS t is equivalent to ReadS (forall b. (forall a. t a -- -> b) -> b), which is in turn equivalent to ReadS -- (Exists t) (with data Exists t where Exists :: t a -> -- Exists t) type GReadS t = String -> [(GReadResult t, String)] -- | Read-like class for 1-type-parameter GADTs. Unlike -- GShow, this one cannot be mechanically derived from a -- Read instance because greadsPrec must choose the phantom -- type based on the String being parsed. class GRead t greadsPrec :: GRead t => Int -> GReadS t greads :: GRead t => GReadS t gread :: GRead t => String -> (forall a. t a -> b) -> b module Data.GADT.Compare -- | Backwards compatibility alias; as of GHC 7.8, this is the same as -- `(:~:)`. type (:=) = (:~:) -- | A class for type-contexts which contain enough information to (at -- least in some cases) decide the equality of types occurring within -- them. class GEq f -- | Produce a witness of type-equality, if one exists. -- -- A handy idiom for using this would be to pattern-bind in the Maybe -- monad, eg.: -- --
--   extract :: GEq tag => tag a -> DSum tag -> Maybe a
--   extract t1 (t2 :=> x) = do
--       Refl <- geq t1 t2
--       return x
--   
-- -- Or in a list comprehension: -- --
--   extractMany :: GEq tag => tag a -> [DSum tag] -> [a]
--   extractMany t1 things = [ x | (t2 :=> x) <- things, Refl <- maybeToList (geq t1 t2)]
--   
-- -- (Making use of the DSum type from Data.Dependent.Sum -- in both examples) geq :: GEq f => f a -> f b -> Maybe (a := b) -- | If f has a GEq instance, this function makes a -- suitable default implementation of '(==)'. defaultEq :: GEq f => f a -> f b -> Bool -- | If f has a GEq instance, this function makes a -- suitable default implementation of '(/=)'. defaultNeq :: GEq f => f a -> f b -> Bool -- | A type for the result of comparing GADT constructors; the type -- parameters of the GADT values being compared are included so that in -- the case where they are equal their parameter types can be unified. data GOrdering a b [GLT] :: GOrdering a b [GEQ] :: GOrdering t t [GGT] :: GOrdering a b -- | TODO: Think of a better name -- -- This operation forgets the phantom types of a GOrdering value. weakenOrdering :: GOrdering a b -> Ordering -- | Type class for comparable GADT-like structures. When 2 things are -- equal, must return a witness that their parameter types are equal as -- well (GEQ). class GEq f => GCompare f gcompare :: GCompare f => f a -> f b -> GOrdering a b defaultCompare :: GCompare f => f a -> f b -> Ordering -- | Propositional equality. If a :~: b is inhabited by some -- terminating value, then the type a is the same as the type -- b. To use this equality in practice, pattern-match on the -- a :~: b to get out the Refl constructor; in the body -- of the pattern-match, the compiler knows that a ~ b. data (:~:) k (a :: k) (b :: k) :: forall k. k -> k -> * [Refl] :: (:~:) k a a instance forall k (a :: k). Data.GADT.Show.GShow ((Data.GADT.Compare.:=) a) instance forall k (a :: k). Data.GADT.Show.GRead ((Data.GADT.Compare.:=) a) instance forall k (a :: k). Data.GADT.Compare.GEq ((Data.GADT.Compare.:=) a) instance forall k (a :: k) (b :: k). GHC.Classes.Eq (Data.GADT.Compare.GOrdering a b) instance forall k (a :: k) (b :: k). GHC.Classes.Ord (Data.GADT.Compare.GOrdering a b) instance forall k (a :: k) (b :: k). GHC.Show.Show (Data.GADT.Compare.GOrdering a b) instance forall k (a :: k). Data.GADT.Show.GShow (Data.GADT.Compare.GOrdering a) instance forall k (a :: k). Data.GADT.Show.GRead (Data.GADT.Compare.GOrdering a) instance forall k (a :: k). Data.GADT.Compare.GCompare ((Data.GADT.Compare.:=) a) module Data.Some data Some tag [This] :: !(tag t) -> Some tag withSome :: Some tag -> (forall a. tag a -> b) -> b instance forall k (tag :: k -> *). Data.GADT.Show.GShow tag => GHC.Show.Show (Data.Some.Some tag) instance forall k (f :: k -> *). Data.GADT.Show.GRead f => GHC.Read.Read (Data.Some.Some f) instance forall k (tag :: k -> *). Data.GADT.Compare.GEq tag => GHC.Classes.Eq (Data.Some.Some tag) instance forall k (tag :: k -> *). Data.GADT.Compare.GCompare tag => GHC.Classes.Ord (Data.Some.Some tag) module Data.Dependent.Sum -- | A basic dependent sum type; the first component is a tag that -- specifies the type of the second; for example, think of a GADT such -- as: -- --
--   data Tag a where
--      AString :: Tag String
--      AnInt   :: Tag Int
--   
-- -- Then, we have the following valid expressions of type Applicative -- f => DSum Tag f: -- --
--   AString ==> "hello!"
--   AnInt   ==> 42
--   
-- -- And we can write functions that consume DSum Tag f values by -- matching, such as: -- --
--   toString :: DSum Tag Identity -> String
--   toString (AString :=> Identity str) = str
--   toString (AnInt   :=> Identity int) = show int
--   
-- -- By analogy to the (key => value) construction for dictionary -- entries in many dynamic languages, we use (key :=> value) as the -- constructor for dependent sums. The :=> and ==> operators have -- very low precedence and bind to the right, so if the Tag GADT -- is extended with an additional constructor Rec :: Tag (DSum Tag -- Identity), then Rec ==> AnInt ==> 3 + 4 is parsed -- as would be expected (Rec ==> (AnInt ==> (3 + 4))) and -- has type DSum Identity Tag. Its precedence is just above that -- of $, so foo bar $ AString ==> "eep" is equivalent -- to foo bar (AString ==> "eep"). data DSum tag f (:=>) :: !(tag a) -> f a -> DSum tag f (==>) :: Applicative f => tag a -> a -> DSum tag f infixr 1 ==> -- | In order to make a Show instance for DSum tag f, -- tag must be able to show itself as well as any value of the -- tagged type. GShow together with this class provides the -- interface by which it can do so. -- -- ShowTag tag f => t is conceptually equivalent to something -- like this imaginary syntax: (forall a. Inhabited (tag a) => -- Show (f a)) => t, where Inhabited is an imaginary -- predicate that characterizes non-empty types, and f and -- a do not occur free in t. -- -- The Tag example type introduced in the DSum section -- could be given the following instances, among others: -- --
--   instance GShow Tag where
--       gshowsPrec _p AString = showString "AString"
--       gshowsPrec _p AnInt   = showString "AnInt"
--   instance ShowTag Tag [] where
--       showTaggedPrec AString = showsPrec
--       showTaggedPrec AnInt   = showsPrec
--   
class GShow tag => ShowTag tag f -- | Given a value of type tag a, return the showsPrec -- function for the type f a. showTaggedPrec :: ShowTag tag f => tag a -> Int -> f a -> ShowS class GRead tag => ReadTag tag f readTaggedPrec :: ReadTag tag f => tag a -> Int -> ReadS (f a) -- | In order to make a Read instance for DSum tag f, -- tag must be able to parse itself as well as any value of the -- tagged type. GRead together with this class provides the -- interface by which it can do so. -- -- ReadTag tag f => t is conceptually equivalent to something -- like this imaginary syntax: (forall a. Inhabited (tag a) => -- Read (f a)) => t, where Inhabited is an imaginary -- predicate that characterizes non-empty types, and f and -- a do not occur free in t. -- -- The Tag example type introduced in the DSum section -- could be given the following instances, among others: -- --
--   instance GRead Tag where
--       greadsPrec _p str = case tag of
--          "AString"   -> [(\k -> k AString, rest)]
--          "AnInt"     -> [(\k -> k AnInt,   rest)]
--          _           -> []
--          where (tag, rest) = break isSpace str
--   instance ReadTag Tag [] where
--       readTaggedPrec AString = readsPrec
--       readTaggedPrec AnInt   = readsPrec
--   
-- | In order to test DSum tag f for equality, tag must -- know how to test both itself and its tagged values for equality. -- EqTag defines the interface by which they are expected to do -- so. -- -- Continuing the Tag example from the DSum section, we -- can define: -- --
--   instance GEq Tag where
--       geq AString AString = Just Refl
--       geq AnInt   AnInt   = Just Refl
--       geq _       _       = Nothing
--   instance EqTag Tag [] where
--       eqTagged AString AString = (==)
--       eqTagged AnInt   AnInt   = (==)
--   
-- -- Note that eqTagged is not called until after the tags have been -- compared, so it only needs to consider the cases where gcompare -- returns GEQ. class GEq tag => EqTag tag f -- | Given two values of type tag a (for which gcompare -- returns GEQ), return the == function for the type f -- a. eqTagged :: EqTag tag f => tag a -> tag a -> f a -> f a -> Bool -- | In order to compare DSum tag f values, tag must know -- how to compare both itself and its tagged values. OrdTag -- defines the interface by which they are expected to do so. -- -- Continuing the Tag example from the EqTag section, we -- can define: -- --
--   instance GCompare Tag where
--       gcompare AString AString = GEQ
--       gcompare AString AnInt   = GLT
--       gcompare AnInt   AString = GGT
--       gcompare AnInt   AnInt   = GEQ
--   instance OrdTag Tag [] where
--       compareTagged AString AString = compare
--       compareTagged AnInt   AnInt   = compare
--   
-- -- As with eqTagged, compareTagged only needs to consider -- cases where gcompare returns GEQ. class (EqTag tag f, GCompare tag) => OrdTag tag f -- | Given two values of type tag a (for which gcompare -- returns GEQ), return the compare function for the type -- f a. compareTagged :: OrdTag tag f => tag a -> tag a -> f a -> f a -> Ordering instance forall k (f :: k -> *) (a :: k). GHC.Show.Show (f a) => Data.Dependent.Sum.ShowTag ((Data.GADT.Compare.:=) a) f instance forall k (f :: k -> *) (a :: k). GHC.Show.Show (f a) => Data.Dependent.Sum.ShowTag (Data.GADT.Compare.GOrdering a) f instance forall k (tag :: k -> *) (f :: k -> *). Data.Dependent.Sum.ShowTag tag f => GHC.Show.Show (Data.Dependent.Sum.DSum tag f) instance forall k (f :: k -> *) (a :: k). GHC.Read.Read (f a) => Data.Dependent.Sum.ReadTag ((Data.GADT.Compare.:=) a) f instance forall k (tag :: k -> *) (f :: k -> *). Data.Dependent.Sum.ReadTag tag f => GHC.Read.Read (Data.Dependent.Sum.DSum tag f) instance forall k (f :: k -> *) (a :: k). GHC.Classes.Eq (f a) => Data.Dependent.Sum.EqTag ((Data.GADT.Compare.:=) a) f instance forall k (tag :: k -> *) (f :: k -> *). Data.Dependent.Sum.EqTag tag f => GHC.Classes.Eq (Data.Dependent.Sum.DSum tag f) instance forall k (f :: k -> *) (a :: k). GHC.Classes.Ord (f a) => Data.Dependent.Sum.OrdTag ((Data.GADT.Compare.:=) a) f instance forall k (tag :: k -> *) (f :: k -> *). Data.Dependent.Sum.OrdTag tag f => GHC.Classes.Ord (Data.Dependent.Sum.DSum tag f)