HORIZON HASKELLDocslts/ghc-9.10.xc74966e2026-09-27Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · c74966e · 2026-09-27

Moduledependent-sum-0.7.2.0Haskell2010

Data.Dependent.Sum

  • 5 types
  • 7 values
datadata DSum (tag :: k -> Type) (f :: k -> Type)
#

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.

Constructors

  • forall a. tag a :=> f ainfixr 1
Instances4Eq, Ord, Read, Show
typetype ShowTag (tag :: k' -> Type) (f :: k' -> Type) = (GShow tag, Has' Show tag f)
#

Deprecated. Instead of 'ShowTag tag f', use '(GShow tag, Has' Show tag f)'

typetype ReadTag (tag :: k' -> Type) (f :: k' -> Type) = (GRead tag, Has' Read tag f)
#

Deprecated. Instead of 'ReadTag tag f', use '(GRead tag, Has' Read tag f)'

typetype EqTag (tag :: k' -> Type) (f :: k' -> Type) = (GEq tag, Has' Eq tag f)
#

Deprecated. Instead of 'EqTag tag f', use '(GEq tag, Has' Eq tag f)'

typetype OrdTag (tag :: k' -> Type) (f :: k' -> Type) = (GCompare tag, Has' Eq tag f, Has' Ord tag f)
#

Deprecated. Instead of 'OrdTag tag f', use '(GCompare tag, Has' Eq tag f, Has' Ord tag f)'