-- 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.7.2.0 module Data.Dependent.Sum -- | A basic dependent sum type where 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
--      Rec     :: Tag (DSum Tag Identity)
--   
-- -- Then we can write expressions where the RHS of -- (:=>) has different types depending on the -- Tag constructor used. Here are some expressions of type -- DSum Tag Identity: -- --
--   AString :=> Identity "hello!"
--   AnInt   :=> Identity 42
--   
-- -- Often, the f we choose has an Applicative instance, -- and we can use the helper function (==>). The -- following expressions all have the type Applicative f => DSum -- Tag f: -- --
--   AString ==> "hello!"
--   AnInt   ==> 42
--   
-- -- 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
--   toString (Rec     :=> Identity sum) = toString sum
--   
-- -- The (:=>) constructor and (==>) -- helper are chosen to resemble the (key => value) -- construction for dictionary entries in many dynamic languages. The -- :=> and ==> operators have very low precedence -- and bind to the right, making repeated use of these operators behave -- as you'd expect: -- --
--   -- Parses as: Rec ==> (AnInt ==> (3 + 4))
--   -- Has type: Applicative f => DSum Tag f
--   Rec ==> AnInt ==> 3 + 4
--   
-- -- The precedence of these operators is just above that of $, so -- foo bar $ AString ==> "eep" is equivalent to foo bar -- (AString ==> "eep"). -- -- To use the Eq, Ord, Read, and Show -- instances for DSum tag f, you will need an -- ArgDict instance for your tag type. Use deriveArgDict -- from the constraints-extras package to generate this -- instance. data DSum tag f (:=>) :: !tag a -> f a -> DSum tag f infixr 1 :=> -- | Convenience helper. Uses pure to lift a into f -- a. (==>) :: Applicative f => tag a -> a -> DSum tag f infixr 1 ==> -- | Deprecated: Instead of 'ShowTag tag f', use '(GShow tag, Has' Show -- tag f)' type ShowTag tag f = (GShow tag, Has' Show tag f) showTaggedPrec :: forall tag f a. (GShow tag, Has' Show tag f) => tag a -> Int -> f a -> ShowS -- | Deprecated: Instead of 'ReadTag tag f', use '(GRead tag, Has' Read -- tag f)' type ReadTag tag f = (GRead tag, Has' Read tag f) readTaggedPrec :: forall tag f a. (GRead tag, Has' Read tag f) => tag a -> Int -> ReadS (f a) -- | Deprecated: Instead of 'EqTag tag f', use '(GEq tag, Has' Eq tag -- f)' type EqTag tag f = (GEq tag, Has' Eq tag f) eqTaggedPrec :: forall tag f a. (GEq tag, Has' Eq tag f) => tag a -> tag a -> f a -> f a -> Bool eqTagged :: forall tag f a. EqTag tag f => tag a -> tag a -> f a -> f a -> Bool -- | Deprecated: Instead of 'OrdTag tag f', use '(GCompare tag, Has' Eq -- tag f, Has' Ord tag f)' type OrdTag tag f = (GCompare tag, Has' Eq tag f, Has' Ord tag f) compareTaggedPrec :: forall tag f a. (GCompare tag, Has' Eq tag f, Has' Ord tag f) => tag a -> tag a -> f a -> f a -> Ordering compareTagged :: forall tag f a. OrdTag tag f => tag a -> tag a -> f a -> f a -> Ordering instance forall k (tag :: k -> *) (f :: k -> *). (Data.GADT.Internal.GShow tag, Data.Constraint.Extras.Has' GHC.Show.Show tag f) => GHC.Show.Show (Data.Dependent.Sum.DSum tag f) instance forall k (tag :: k -> *) (f :: k -> *). (Data.GADT.Internal.GRead tag, Data.Constraint.Extras.Has' GHC.Read.Read tag f) => GHC.Read.Read (Data.Dependent.Sum.DSum tag f) instance forall k (tag :: k -> *) (f :: k -> *). (Data.GADT.Internal.GEq tag, Data.Constraint.Extras.Has' GHC.Classes.Eq tag f) => GHC.Classes.Eq (Data.Dependent.Sum.DSum tag f) instance forall k (tag :: k -> *) (f :: k -> *). (Data.GADT.Internal.GCompare tag, Data.Constraint.Extras.Has' GHC.Classes.Eq tag f, Data.Constraint.Extras.Has' GHC.Classes.Ord tag f) => GHC.Classes.Ord (Data.Dependent.Sum.DSum tag f)