Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
- data Map k v
- type EmptyMap = (E :: Map k v)
- class KeysValuesAllF c t => KeysValuesAll (c :: k -> v -> Constraint) (t :: Map k v)
- class KnownSymbol k => KnownKey (k :: Symbol) (v :: z)
- demoteKeys :: KeysValuesAll (KnownKey :: Symbol -> Type -> Constraint) t => Record (K String :: Type -> Type) t
- class (KnownSymbol k, Typeable v) => KnownKeyTypeableValue (k :: Symbol) v
- demoteEntries :: KeysValuesAll KnownKeyTypeableValue t => Record (K (String, TypeRep) :: Type -> Type) t
- data Record (f :: Type -> Type) (t :: Map Symbol Type)
- unit :: Record f (E :: Map Symbol Type)
- cpure_Record :: KeysValuesAll c t => Proxy c -> (forall (k :: Symbol) v. c k v => f v) -> Record f t
- collapse_Record :: Productlike ([] :: [Type]) t result => Record (K a :: Type -> Type) t -> [a]
- prettyShowRecord :: (KeysValuesAll (KnownKey :: Symbol -> Type -> Constraint) t, Productlike ([] :: [Type]) t flat, All Show flat, SListI flat) => (forall x. Show x => f x -> String) -> Record f t -> String
- prettyShowRecordI :: (KeysValuesAll (KnownKey :: Symbol -> Type -> Constraint) t, Productlike ([] :: [Type]) t flat, All Show flat, SListI flat) => Record I t -> String
- data Variant (f :: Type -> Type) (t :: Map Symbol Type)
- impossible :: Variant f (E :: Map Symbol Type) -> b
- prettyShowVariant :: (KeysValuesAll (KnownKey :: Symbol -> Type -> Constraint) t, Productlike ([] :: [Type]) t flat, Sumlike ([] :: [Type]) t flat, All Show flat, SListI flat) => (forall x. Show x => f x -> String) -> Variant f t -> String
- prettyShowVariantI :: (KeysValuesAll (KnownKey :: Symbol -> Type -> Constraint) t, Productlike ([] :: [Type]) t flat, Sumlike ([] :: [Type]) t flat, All Show flat, SListI flat) => Variant I t -> String
- class Insertable (k :: Symbol) v (t :: Map Symbol Type) where
- addField :: Insertable k v t => f v -> Record f t -> Record f (Insert k v t)
- insertI :: Insertable k v t => v -> Record I t -> Record I (Insert k v t)
- addFieldI :: Insertable k v t => v -> Record I t -> Record I (Insert k v t)
- type family InsertAll (es :: [(Symbol, Type)]) (t :: Map Symbol Type) :: Map Symbol Type where ...
- type FromList (es :: [(Symbol, Type)]) = InsertAll es (E :: Map Symbol Type)
- class Deletable (k :: Symbol) v (t :: Map Symbol Type) where
- winnowI :: Deletable k v t => Variant I t -> Either (Variant I (Delete k v t)) v
- class Key (k :: Symbol) (t :: Map Symbol Type) where
- type family Field (f :: Type -> Type) (t :: Map Symbol Type) v :: Type where ...
- type family Branch (f :: Type -> Type) (t :: Map Symbol Type) v :: Type where ...
- project :: Key k t => Record f t -> f (Value k t)
- projectI :: Key k t => Record I t -> Value k t
- getField :: Key k t => Record f t -> f (Value k t)
- getFieldI :: Key k t => Record I t -> Value k t
- setField :: Key k t => f (Value k t) -> Record f t -> Record f t
- setFieldI :: Key k t => Value k t -> Record I t -> Record I t
- modifyField :: Key k t => (f (Value k t) -> f (Value k t)) -> Record f t -> Record f t
- modifyFieldI :: Key k t => (Value k t -> Value k t) -> Record I t -> Record I t
- inject :: Key k t => f (Value k t) -> Variant f t
- injectI :: Key k t => Value k t -> Variant I t
- match :: Key k t => Variant f t -> Maybe (f (Value k t))
- matchI :: Key k t => Variant I t -> Maybe (Value k t)
- eliminate :: (Productlike ([] :: [Type]) t result, Sumlike ([] :: [Type]) t result, SListI result) => Record (Case f r) t -> Variant f t -> r
- newtype Case (f :: k -> Type) a (b :: k) :: forall k. (k -> Type) -> Type -> k -> Type = Case (f b -> a)
- addCase :: Insertable k v t => (f v -> a) -> Record (Case f a) t -> Record (Case f a) (Insert k v t)
- addCaseI :: Insertable k v t => (v -> a) -> Record (Case I a) t -> Record (Case I a) (Insert k v t)
- class (Key k t, Value k t ~ v) => PresentIn (t :: Map Symbol Type) (k :: Symbol) v
- type ProductlikeSubset (subset :: Map Symbol Type) (whole :: Map Symbol Type) (flat :: [Type]) = (KeysValuesAll (PresentIn whole) subset, Productlike ([] :: [Type]) subset flat, SListI flat)
- fieldSubset :: ProductlikeSubset subset whole flat => Record f whole -> (Record f subset -> Record f whole, Record f subset)
- projectSubset :: ProductlikeSubset subset whole flat => Record f whole -> Record f subset
- getFieldSubset :: ProductlikeSubset subset whole flat => Record f whole -> Record f subset
- setFieldSubset :: ProductlikeSubset subset whole flat => Record f subset -> Record f whole -> Record f whole
- modifyFieldSubset :: ProductlikeSubset subset whole flat => (Record f subset -> Record f subset) -> Record f whole -> Record f whole
- type SumlikeSubset (subset :: Map Symbol Type) (whole :: Map Symbol Type) (subflat :: [Type]) (wholeflat :: [Type]) = (KeysValuesAll (PresentIn whole) subset, Productlike ([] :: [Type]) whole wholeflat, Sumlike ([] :: [Type]) whole wholeflat, SListI wholeflat, Productlike ([] :: [Type]) subset subflat, Sumlike ([] :: [Type]) subset subflat, SListI subflat)
- branchSubset :: SumlikeSubset subset whole subflat wholeflat => (Variant f whole -> Maybe (Variant f subset), Variant f subset -> Variant f whole)
- injectSubset :: SumlikeSubset subset whole subflat wholeflat => Variant f subset -> Variant f whole
- matchSubset :: SumlikeSubset subset whole subflat wholeflat => Variant f whole -> Maybe (Variant f subset)
- eliminateSubset :: SumlikeSubset subset whole subflat wholeflat => Record (Case f r) whole -> Variant f subset -> r
- class ToRecord r where
- type RecordCode r :: Map Symbol Type
- toRecord :: r -> Record I (RecordCode r)
- class ToRecord r => FromRecord r where
- fromRecord :: Record I (RecordCode r) -> r
- type family VariantCode s :: Map Symbol Type where ...
- class ToVariant s where
- toVariant :: s -> Variant I (VariantCode s)
- class FromVariant s where
- fromVariant :: Variant I (VariantCode s) -> s
- class Productlike (start :: [Type]) (t :: Map Symbol Type) (result :: [Type]) | start t -> result, result t -> start where
- fromNP :: Productlike ([] :: [Type]) t result => NP f result -> Record f t
- toNP :: Productlike ([] :: [Type]) t result => Record f t -> NP f result
- class Sumlike (start :: [Type]) (t :: Map Symbol Type) (result :: [Type]) | start t -> result, result t -> start where
- fromNS :: Sumlike ([] :: [Type]) t result => NS f result -> Variant f t
- toNS :: Sumlike ([] :: [Type]) t result => Variant f t -> NS f result
- newtype I a = I a
- newtype K a (b :: k) :: forall k. Type -> k -> Type = K a
- data NP (a :: k -> Type) (b :: [k]) :: forall k. (k -> Type) -> [k] -> Type where
- data NS (a :: k -> Type) (b :: [k]) :: forall k. (k -> Type) -> [k] -> Type where
Type-level Red-Black tree
A Red-Black tree that is used at the type level, with DataKinds
. The tree
keeps track of what keys are present and to what types they correspond.
class KeysValuesAllF c t => KeysValuesAll (c :: k -> v -> Constraint) (t :: Map k v) #
cpara_Map
Instances
KeysValuesAll (c :: k -> v -> Constraint) (E :: Map k v) | |
Defined in Data.RBR.Internal cpara_Map :: proxy c -> r E -> (forall (left :: Map k0 v0) (k1 :: k0) (v1 :: v0) (right :: Map k0 v0) (color :: Color). (c k1 v1, KeysValuesAll c left, KeysValuesAll c right) => r left -> r right -> r (N color left k1 v1 right)) -> r E | |
(c k2 v2, KeysValuesAll c left, KeysValuesAll c right) => KeysValuesAll (c :: k1 -> v1 -> Constraint) (N color left k2 v2 right :: Map k1 v1) | |
Defined in Data.RBR.Internal cpara_Map :: proxy c -> r E -> (forall (left0 :: Map k v) (k10 :: k) (v10 :: v) (right0 :: Map k v) (color0 :: Color). (c k10 v10, KeysValuesAll c left0, KeysValuesAll c right0) => r left0 -> r right0 -> r (N color0 left0 k10 v10 right0)) -> r (N color left k2 v2 right) |
class KnownSymbol k => KnownKey (k :: Symbol) (v :: z) #
Instances
KnownSymbol k => KnownKey k (v :: z) | |
Defined in Data.RBR.Internal |
demoteKeys :: KeysValuesAll (KnownKey :: Symbol -> Type -> Constraint) t => Record (K String :: Type -> Type) t #
class (KnownSymbol k, Typeable v) => KnownKeyTypeableValue (k :: Symbol) v #
Instances
(KnownSymbol k, Typeable v) => KnownKeyTypeableValue k v | |
Defined in Data.RBR.Internal |
demoteEntries :: KeysValuesAll KnownKeyTypeableValue t => Record (K (String, TypeRep) :: Type -> Type) t #
Records and Variants
cpure_Record :: KeysValuesAll c t => Proxy c -> (forall (k :: Symbol) v. c k v => f v) -> Record f t #
collapse_Record :: Productlike ([] :: [Type]) t result => Record (K a :: Type -> Type) t -> [a] #
prettyShowRecord :: (KeysValuesAll (KnownKey :: Symbol -> Type -> Constraint) t, Productlike ([] :: [Type]) t flat, All Show flat, SListI flat) => (forall x. Show x => f x -> String) -> Record f t -> String #
prettyShowRecordI :: (KeysValuesAll (KnownKey :: Symbol -> Type -> Constraint) t, Productlike ([] :: [Type]) t flat, All Show flat, SListI flat) => Record I t -> String #
prettyShowVariant :: (KeysValuesAll (KnownKey :: Symbol -> Type -> Constraint) t, Productlike ([] :: [Type]) t flat, Sumlike ([] :: [Type]) t flat, All Show flat, SListI flat) => (forall x. Show x => f x -> String) -> Variant f t -> String #
prettyShowVariantI :: (KeysValuesAll (KnownKey :: Symbol -> Type -> Constraint) t, Productlike ([] :: [Type]) t flat, Sumlike ([] :: [Type]) t flat, All Show flat, SListI flat) => Variant I t -> String #
Inserting and widening
class Insertable (k :: Symbol) v (t :: Map Symbol Type) where #
type family InsertAll (es :: [(Symbol, Type)]) (t :: Map Symbol Type) :: Map Symbol Type where ... #
Deleting and winnowing
class Deletable (k :: Symbol) v (t :: Map Symbol Type) where #
Projecting and injecting
Eliminating variants
eliminate :: (Productlike ([] :: [Type]) t result, Sumlike ([] :: [Type]) t result, SListI result) => Record (Case f r) t -> Variant f t -> r #
newtype Case (f :: k -> Type) a (b :: k) :: forall k. (k -> Type) -> Type -> k -> Type #
Case (f b -> a) |
addCase :: Insertable k v t => (f v -> a) -> Record (Case f a) t -> Record (Case f a) (Insert k v t) #
addCaseI :: Insertable k v t => (v -> a) -> Record (Case I a) t -> Record (Case I a) (Insert k v t) #
Subsets of fields and branches
class (Key k t, Value k t ~ v) => PresentIn (t :: Map Symbol Type) (k :: Symbol) v #
Instances
(Key k t, Value k t ~ v) => PresentIn t k v | |
Defined in Data.RBR.Internal |
type ProductlikeSubset (subset :: Map Symbol Type) (whole :: Map Symbol Type) (flat :: [Type]) = (KeysValuesAll (PresentIn whole) subset, Productlike ([] :: [Type]) subset flat, SListI flat) #
fieldSubset :: ProductlikeSubset subset whole flat => Record f whole -> (Record f subset -> Record f whole, Record f subset) #
projectSubset :: ProductlikeSubset subset whole flat => Record f whole -> Record f subset #
getFieldSubset :: ProductlikeSubset subset whole flat => Record f whole -> Record f subset #
setFieldSubset :: ProductlikeSubset subset whole flat => Record f subset -> Record f whole -> Record f whole #
modifyFieldSubset :: ProductlikeSubset subset whole flat => (Record f subset -> Record f subset) -> Record f whole -> Record f whole #
type SumlikeSubset (subset :: Map Symbol Type) (whole :: Map Symbol Type) (subflat :: [Type]) (wholeflat :: [Type]) = (KeysValuesAll (PresentIn whole) subset, Productlike ([] :: [Type]) whole wholeflat, Sumlike ([] :: [Type]) whole wholeflat, SListI wholeflat, Productlike ([] :: [Type]) subset subflat, Sumlike ([] :: [Type]) subset subflat, SListI subflat) #
branchSubset :: SumlikeSubset subset whole subflat wholeflat => (Variant f whole -> Maybe (Variant f subset), Variant f subset -> Variant f whole) #
injectSubset :: SumlikeSubset subset whole subflat wholeflat => Variant f subset -> Variant f whole #
matchSubset :: SumlikeSubset subset whole subflat wholeflat => Variant f whole -> Maybe (Variant f subset) #
eliminateSubset :: SumlikeSubset subset whole subflat wholeflat => Record (Case f r) whole -> Variant f subset -> r #
Interfacing with normal records
Typeclasses for converting to and from normal Haskell records and sum types.
They have default implementations based in GHC.Generics:
>>>
data Person = Person { name :: String, age :: Int } deriving (Generic, Show)
>>>
instance ToRecord Person
>>>
instance FromRecord Person
>>>
data Summy = Lefty Int | Righty Bool deriving (Generic,Show)
>>>
instance ToVariant Summy
>>>
instance FromVariant Summy
Only single-constructor records with named fields can have ToRecord
and
FromRecord
instances.
Only sum types with exactly one anonymous argument on each branch can have
ToVariant
and FromVariant
instances.
type family VariantCode s :: Map Symbol Type where ... #
VariantCode s = VariantCode' (E :: Map Symbol Type) (Rep s) |
Interfacing with Data.SOP
class Productlike (start :: [Type]) (t :: Map Symbol Type) (result :: [Type]) | start t -> result, result t -> start where #
Instances
Productlike start (E :: Map Symbol Type) start | |
(Productlike start right middle, Productlike (v ': middle) left result) => Productlike start (N color left k v right) result | |
class Sumlike (start :: [Type]) (t :: Map Symbol Type) (result :: [Type]) | start t -> result, result t -> start where #
prefixNS :: Either (NS f start) (Variant f t) -> NS f result #
breakNS :: NS f result -> Either (NS f start) (Variant f t) #
Instances
(Sumlike start (N colorR leftR kR vR rightR) middle, Sumlike (v ': middle) (N colorL leftL kL vL rightL) result) => Sumlike start (N color (N colorL leftL kL vL rightL) k v (N colorR leftR kR vR rightR)) result | |
Sumlike (v ': start) (N colorL leftL kL vL rightL) result => Sumlike start (N color (N colorL leftL kL vL rightL) k v (E :: Map Symbol Type)) result | |
Sumlike start (N color (E :: Map Symbol Type) k v (E :: Map Symbol Type)) (v ': start) | |
Sumlike start (N colorR leftR kR vR rightR) middle => Sumlike start (N color (E :: Map Symbol Type) k v (N colorR leftR kR vR rightR)) (v ': middle) | |
Data.SOP re-exports
The identity type functor.
Like Identity
, but with a shorter name.
I a |
Instances
Monad I | |
Functor I | |
Applicative I | |
Foldable I | |
Defined in Data.SOP.BasicFunctors fold :: Monoid m => I m -> m # foldMap :: Monoid m => (a -> m) -> I a -> m # foldr :: (a -> b -> b) -> b -> I a -> b # foldr' :: (a -> b -> b) -> b -> I a -> b # foldl :: (b -> a -> b) -> b -> I a -> b # foldl' :: (b -> a -> b) -> b -> I a -> b # foldr1 :: (a -> a -> a) -> I a -> a # foldl1 :: (a -> a -> a) -> I a -> a # elem :: Eq a => a -> I a -> Bool # maximum :: Ord a => I a -> a # | |
Traversable I | |
Eq1 I | Since: sop-core-0.2.4.0 |
Ord1 I | Since: sop-core-0.2.4.0 |
Defined in Data.SOP.BasicFunctors | |
Read1 I | Since: sop-core-0.2.4.0 |
Show1 I | Since: sop-core-0.2.4.0 |
NFData1 I | Since: sop-core-0.2.5.0 |
Defined in Data.SOP.BasicFunctors | |
Eq a => Eq (I a) | |
Ord a => Ord (I a) | |
Read a => Read (I a) | |
Show a => Show (I a) | |
Generic (I a) | |
Semigroup a => Semigroup (I a) | Since: sop-core-0.4.0.0 |
Monoid a => Monoid (I a) | Since: sop-core-0.4.0.0 |
NFData a => NFData (I a) | Since: sop-core-0.2.5.0 |
Defined in Data.SOP.BasicFunctors | |
type Rep (I a) | |
Defined in Data.SOP.BasicFunctors |
newtype K a (b :: k) :: forall k. Type -> k -> Type #
The constant type functor.
Like Constant
, but kind-polymorphic
in its second argument and with a shorter name.
K a |
Instances
Eq2 (K :: Type -> Type -> Type) | Since: sop-core-0.2.4.0 |
Ord2 (K :: Type -> Type -> Type) | Since: sop-core-0.2.4.0 |
Defined in Data.SOP.BasicFunctors | |
Read2 (K :: Type -> Type -> Type) | Since: sop-core-0.2.4.0 |
Defined in Data.SOP.BasicFunctors liftReadsPrec2 :: (Int -> ReadS a) -> ReadS [a] -> (Int -> ReadS b) -> ReadS [b] -> Int -> ReadS (K a b) # liftReadList2 :: (Int -> ReadS a) -> ReadS [a] -> (Int -> ReadS b) -> ReadS [b] -> ReadS [K a b] # liftReadPrec2 :: ReadPrec a -> ReadPrec [a] -> ReadPrec b -> ReadPrec [b] -> ReadPrec (K a b) # liftReadListPrec2 :: ReadPrec a -> ReadPrec [a] -> ReadPrec b -> ReadPrec [b] -> ReadPrec [K a b] # | |
Show2 (K :: Type -> Type -> Type) | Since: sop-core-0.2.4.0 |
NFData2 (K :: Type -> Type -> Type) | Since: sop-core-0.2.5.0 |
Defined in Data.SOP.BasicFunctors | |
Functor (K a :: Type -> Type) | |
Monoid a => Applicative (K a :: Type -> Type) | |
Foldable (K a :: Type -> Type) | |
Defined in Data.SOP.BasicFunctors fold :: Monoid m => K a m -> m # foldMap :: Monoid m => (a0 -> m) -> K a a0 -> m # foldr :: (a0 -> b -> b) -> b -> K a a0 -> b # foldr' :: (a0 -> b -> b) -> b -> K a a0 -> b # foldl :: (b -> a0 -> b) -> b -> K a a0 -> b # foldl' :: (b -> a0 -> b) -> b -> K a a0 -> b # foldr1 :: (a0 -> a0 -> a0) -> K a a0 -> a0 # foldl1 :: (a0 -> a0 -> a0) -> K a a0 -> a0 # elem :: Eq a0 => a0 -> K a a0 -> Bool # maximum :: Ord a0 => K a a0 -> a0 # minimum :: Ord a0 => K a a0 -> a0 # | |
Traversable (K a :: Type -> Type) | |
Eq a => Eq1 (K a :: Type -> Type) | Since: sop-core-0.2.4.0 |
Ord a => Ord1 (K a :: Type -> Type) | Since: sop-core-0.2.4.0 |
Defined in Data.SOP.BasicFunctors | |
Read a => Read1 (K a :: Type -> Type) | Since: sop-core-0.2.4.0 |
Defined in Data.SOP.BasicFunctors | |
Show a => Show1 (K a :: Type -> Type) | Since: sop-core-0.2.4.0 |
NFData a => NFData1 (K a :: Type -> Type) | Since: sop-core-0.2.5.0 |
Defined in Data.SOP.BasicFunctors | |
Eq a => Eq (K a b) | |
Ord a => Ord (K a b) | |
Read a => Read (K a b) | |
Show a => Show (K a b) | |
Generic (K a b) | |
Semigroup a => Semigroup (K a b) | Since: sop-core-0.4.0.0 |
Monoid a => Monoid (K a b) | Since: sop-core-0.4.0.0 |
NFData a => NFData (K a b) | Since: sop-core-0.2.5.0 |
Defined in Data.SOP.BasicFunctors | |
type Rep (K a b) | |
Defined in Data.SOP.BasicFunctors |
data NP (a :: k -> Type) (b :: [k]) :: forall k. (k -> Type) -> [k] -> Type where #
An n-ary product.
The product is parameterized by a type constructor f
and
indexed by a type-level list xs
. The length of the list
determines the number of elements in the product, and if the
i
-th element of the list is of type x
, then the i
-th
element of the product is of type f x
.
The constructor names are chosen to resemble the names of the list constructors.
Two common instantiations of f
are the identity functor I
and the constant functor K
. For I
, the product becomes a
heterogeneous list, where the type-level list describes the
types of its components. For
, the product becomes a
homogeneous list, where the contents of the type-level list are
ignored, but its length still specifies the number of elements.K
a
In the context of the SOP approach to generic programming, an n-ary product describes the structure of the arguments of a single data constructor.
Examples:
I 'x' :* I True :* Nil :: NP I '[ Char, Bool ] K 0 :* K 1 :* Nil :: NP (K Int) '[ Char, Bool ] Just 'x' :* Nothing :* Nil :: NP Maybe '[ Char, Bool ]
Nil :: forall k (a :: k -> Type) (b :: [k]). NP a ([] :: [k]) | |
(:*) :: forall k (a :: k -> Type) (b :: [k]) (x :: k) (xs :: [k]). a x -> NP a xs -> NP a (x ': xs) infixr 5 |
Instances
HTrans (NP :: (k1 -> Type) -> [k1] -> Type) (NP :: (k2 -> Type) -> [k2] -> Type) | |
HPure (NP :: (k -> Type) -> [k] -> Type) | |
HAp (NP :: (k -> Type) -> [k] -> Type) | |
HCollapse (NP :: (k -> Type) -> [k] -> Type) | |
Defined in Data.SOP.NP | |
HTraverse_ (NP :: (k -> Type) -> [k] -> Type) | |
Defined in Data.SOP.NP hctraverse_ :: (AllN NP c xs, Applicative g) => proxy c -> (forall (a :: k0). c a => f a -> g ()) -> NP f xs -> g () # htraverse_ :: (SListIN NP xs, Applicative g) => (forall (a :: k0). f a -> g ()) -> NP f xs -> g () # | |
HSequence (NP :: (k -> Type) -> [k] -> Type) | |
Defined in Data.SOP.NP hsequence' :: (SListIN NP xs, Applicative f) => NP (f :.: g) xs -> f (NP g xs) # hctraverse' :: (AllN NP c xs, Applicative g) => proxy c -> (forall (a :: k0). c a => f a -> g (f' a)) -> NP f xs -> g (NP f' xs) # htraverse' :: (SListIN NP xs, Applicative g) => (forall (a :: k0). f a -> g (f' a)) -> NP f xs -> g (NP f' xs) # | |
All (Compose Eq f) xs => Eq (NP f xs) | |
(All (Compose Eq f) xs, All (Compose Ord f) xs) => Ord (NP f xs) | |
All (Compose Show f) xs => Show (NP f xs) | |
All (Compose Semigroup f) xs => Semigroup (NP f xs) | Since: sop-core-0.4.0.0 |
(All (Compose Monoid f) xs, All (Compose Semigroup f) xs) => Monoid (NP f xs) | Since: sop-core-0.4.0.0 |
All (Compose NFData f) xs => NFData (NP f xs) | Since: sop-core-0.2.5.0 |
Defined in Data.SOP.NP | |
type Same (NP :: (k1 -> Type) -> [k1] -> Type) | |
type Prod (NP :: (k -> Type) -> [k] -> Type) | |
type UnProd (NP :: (k -> Type) -> [k] -> Type) | |
type CollapseTo (NP :: (k -> Type) -> [k] -> Type) a | |
Defined in Data.SOP.NP | |
type SListIN (NP :: (k -> Type) -> [k] -> Type) | |
Defined in Data.SOP.NP | |
type AllN (NP :: (k -> Type) -> [k] -> Type) (c :: k -> Constraint) | |
Defined in Data.SOP.NP | |
type AllZipN (NP :: (k -> Type) -> [k] -> Type) (c :: a -> b -> Constraint) | |
Defined in Data.SOP.NP |
data NS (a :: k -> Type) (b :: [k]) :: forall k. (k -> Type) -> [k] -> Type where #
An n-ary sum.
The sum is parameterized by a type constructor f
and
indexed by a type-level list xs
. The length of the list
determines the number of choices in the sum and if the
i
-th element of the list is of type x
, then the i
-th
choice of the sum is of type f x
.
The constructor names are chosen to resemble Peano-style
natural numbers, i.e., Z
is for "zero", and S
is for
"successor". Chaining S
and Z
chooses the corresponding
component of the sum.
Examples:
Z :: f x -> NS f (x ': xs) S . Z :: f y -> NS f (x ': y ': xs) S . S . Z :: f z -> NS f (x ': y ': z ': xs) ...
Note that empty sums (indexed by an empty list) have no non-bottom elements.
Two common instantiations of f
are the identity functor I
and the constant functor K
. For I
, the sum becomes a
direct generalization of the Either
type to arbitrarily many
choices. For
, the result is a homogeneous choice type,
where the contents of the type-level list are ignored, but its
length specifies the number of options.K
a
In the context of the SOP approach to generic programming, an n-ary sum describes the top-level structure of a datatype, which is a choice between all of its constructors.
Examples:
Z (I 'x') :: NS I '[ Char, Bool ] S (Z (I True)) :: NS I '[ Char, Bool ] S (Z (K 1)) :: NS (K Int) '[ Char, Bool ]
Z :: forall k (a :: k -> Type) (b :: [k]) (x :: k) (xs :: [k]). a x -> NS a (x ': xs) | |
S :: forall k (a :: k -> Type) (b :: [k]) (xs :: [k]) (x :: k). NS a xs -> NS a (x ': xs) |
Instances
HTrans (NS :: (k1 -> Type) -> [k1] -> Type) (NS :: (k2 -> Type) -> [k2] -> Type) | |
HAp (NS :: (k -> Type) -> [k] -> Type) | |
HCollapse (NS :: (k -> Type) -> [k] -> Type) | |
Defined in Data.SOP.NS | |
HTraverse_ (NS :: (k -> Type) -> [k] -> Type) | |
Defined in Data.SOP.NS hctraverse_ :: (AllN NS c xs, Applicative g) => proxy c -> (forall (a :: k0). c a => f a -> g ()) -> NS f xs -> g () # htraverse_ :: (SListIN NS xs, Applicative g) => (forall (a :: k0). f a -> g ()) -> NS f xs -> g () # | |
HSequence (NS :: (k -> Type) -> [k] -> Type) | |
Defined in Data.SOP.NS hsequence' :: (SListIN NS xs, Applicative f) => NS (f :.: g) xs -> f (NS g xs) # hctraverse' :: (AllN NS c xs, Applicative g) => proxy c -> (forall (a :: k0). c a => f a -> g (f' a)) -> NS f xs -> g (NS f' xs) # htraverse' :: (SListIN NS xs, Applicative g) => (forall (a :: k0). f a -> g (f' a)) -> NS f xs -> g (NS f' xs) # | |
HIndex (NS :: (k -> Type) -> [k] -> Type) | |
Defined in Data.SOP.NS | |
HApInjs (NS :: (k -> Type) -> [k] -> Type) | |
HExpand (NS :: (k -> Type) -> [k] -> Type) | |
All (Compose Eq f) xs => Eq (NS f xs) | |
(All (Compose Eq f) xs, All (Compose Ord f) xs) => Ord (NS f xs) | |
All (Compose Show f) xs => Show (NS f xs) | |
All (Compose NFData f) xs => NFData (NS f xs) | Since: sop-core-0.2.5.0 |
Defined in Data.SOP.NS | |
type Same (NS :: (k1 -> Type) -> [k1] -> Type) | |
type Prod (NS :: (k -> Type) -> [k] -> Type) | |
type CollapseTo (NS :: (k -> Type) -> [k] -> Type) a | |
Defined in Data.SOP.NS | |
type SListIN (NS :: (k -> Type) -> [k] -> Type) | |
Defined in Data.SOP.NS | |
type AllN (NS :: (k -> Type) -> [k] -> Type) (c :: k -> Constraint) | |
Defined in Data.SOP.NS |