Safe Haskell | None |
---|---|
Language | Haskell2010 |
This module implements the internals of open records and variants.
Synopsis
- newtype Row a = R [ LT a]
- data Label (s :: Symbol ) = Label
- class KnownSymbol (n :: Symbol )
- data LT a = Symbol :-> a
- type Empty = R '[]
- data HideType where
- type family Extend (l :: Symbol ) (a :: k) (r :: Row k) :: Row k where ...
- type family Modify (l :: Symbol ) (a :: k) (r :: Row k) :: Row k where ...
- type family Rename (l :: Symbol ) (l' :: Symbol ) (r :: Row k) :: Row k where ...
- type (.==) (l :: Symbol ) (a :: k) = Extend l a Empty
- type family (r :: Row k) .! (t :: Symbol ) :: k where ...
- type family (r :: Row k) .- (s :: Symbol ) :: Row k where ...
- type family (l :: Row k) .\\ (r :: Row k) :: Row k where ...
- type family (l :: Row k) .+ (r :: Row k) :: Row k where ...
- type family (l :: Row k) .\/ (r :: Row k) where ...
- type family (l :: Row k) .// (r :: Row k) where ...
- class Lacks (l :: Symbol ) (r :: Row *)
- type family (r :: Row k) .\ (l :: Symbol ) :: Constraint where ...
- class (r .! l) ≈ a => HasType l a r
-
class
Forall
(r ::
Row
k) (c :: k ->
Constraint
)
where
- metamorph :: forall (p :: * -> * -> *) (f :: Row k -> *) (g :: Row k -> *) (h :: k -> *). Bifunctor p => Proxy ( Proxy h, Proxy p) -> (f Empty -> g Empty ) -> ( forall ℓ τ ρ. ( KnownSymbol ℓ, c τ, HasType ℓ τ ρ) => Label ℓ -> f ρ -> p (f (ρ .- ℓ)) (h τ)) -> ( forall ℓ τ ρ. ( KnownSymbol ℓ, c τ, FrontExtends ℓ τ ρ, AllUniqueLabels ( Extend ℓ τ ρ)) => Label ℓ -> p (g ρ) (h τ) -> g ( Extend ℓ τ ρ)) -> f r -> g r
-
class
BiForall
(r1 ::
Row
k1) (r2 ::
Row
k2) (c :: k1 -> k2 ->
Constraint
)
where
- biMetamorph :: forall (p :: * -> * -> *) (f :: Row k1 -> Row k2 -> *) (g :: Row k1 -> Row k2 -> *) (h :: k1 -> k2 -> *). Bifunctor p => Proxy ( Proxy h, Proxy p) -> (f Empty Empty -> g Empty Empty ) -> ( forall ℓ τ1 τ2 ρ1 ρ2. ( KnownSymbol ℓ, c τ1 τ2, HasType ℓ τ1 ρ1, HasType ℓ τ2 ρ2) => Label ℓ -> f ρ1 ρ2 -> p (f (ρ1 .- ℓ) (ρ2 .- ℓ)) (h τ1 τ2)) -> ( forall ℓ τ1 τ2 ρ1 ρ2. ( KnownSymbol ℓ, c τ1 τ2, FrontExtends ℓ τ1 ρ1, FrontExtends ℓ τ2 ρ2, AllUniqueLabels ( Extend ℓ τ1 ρ1), AllUniqueLabels ( Extend ℓ τ2 ρ2)) => Label ℓ -> p (g ρ1 ρ2) (h τ1 τ2) -> g ( Extend ℓ τ1 ρ1) ( Extend ℓ τ2 ρ2)) -> f r1 r2 -> g r1 r2
- class (c1 x, c2 y) => BiConstraint c1 c2 x y
- class Unconstrained
- class Unconstrained1 a
- class Unconstrained2 a b
-
class
FrontExtends
l t r
where
- frontExtendsDict :: FrontExtendsDict l t r
- data FrontExtendsDict l t r = forall ρ. FrontExtendsDict ( Dict (r ~ R ρ, R ((l :-> t) ': ρ) ≈ Extend l t ( R ρ), AllUniqueLabelsR ((l :-> t) ': ρ)))
- type WellBehaved ρ = ( Forall ρ Unconstrained1 , AllUniqueLabels ρ)
- type family AllUniqueLabels (r :: Row k) :: Constraint where ...
- type family Ap (fs :: Row (a -> b)) (r :: Row a) :: Row b where ...
- type family ApSingle (fs :: Row (a -> b)) (x :: a) :: Row b where ...
- type family Zip (r1 :: Row *) (r2 :: Row *) where ...
- type family Map (f :: a -> b) (r :: Row a) :: Row b where ...
- type family Subset (r1 :: Row k) (r2 :: Row k) :: Constraint where ...
- type Disjoint l r = ( WellBehaved l, WellBehaved r, Subset l (l .+ r), Subset r (l .+ r), ((l .+ r) .\\ l) ≈ r, ((l .+ r) .\\ r) ≈ l)
- type family Labels (r :: Row a) where ...
- labels :: forall ρ c s. ( IsString s, Forall ρ c) => [s]
- labels' :: forall ρ s. ( IsString s, Forall ρ Unconstrained1 ) => [s]
- show' :: ( IsString s, Show a) => a -> s
- toKey :: forall s. KnownSymbol s => Label s -> Text
- type (≈) a b = a ~ b
Rows
The kind of rows. This type is only used as a datakind. A row is a typelevel entity telling us which symbols are associated with which types.
data Label (s :: Symbol ) Source #
A label
class KnownSymbol (n :: Symbol ) Source #
This class gives the string associated with a type-level symbol. There are instances of the class for every concrete literal: "hello", etc.
Since: base-4.7.0.0
symbolSing
The kind of elements of rows. Each element is a label and its associated type.
Instances
( KnownSymbol ℓ, c τ1 τ2, BiForall (' R ρ1) (' R ρ2) c, FrontExtends ℓ τ1 (' R ρ1), FrontExtends ℓ τ2 (' R ρ2), AllUniqueLabels ( Extend ℓ τ1 (' R ρ1)), AllUniqueLabels ( Extend ℓ τ2 (' R ρ2))) => BiForall (' R ((ℓ :-> τ1) ': ρ1) :: Row k1) (' R ((ℓ :-> τ2) ': ρ2) :: Row k2) (c :: k1 -> k2 -> Constraint ) Source # | |
Defined in Data.Row.Internal biMetamorph :: forall p f g h. Bifunctor p => Proxy ( Proxy h, Proxy p) -> (f Empty Empty -> g Empty Empty ) -> ( forall (ℓ0 :: Symbol ) (τ10 :: k10) (τ20 :: k20) (ρ10 :: Row k10) (ρ20 :: Row k20). ( KnownSymbol ℓ0, c τ10 τ20, HasType ℓ0 τ10 ρ10, HasType ℓ0 τ20 ρ20) => Label ℓ0 -> f ρ10 ρ20 -> p (f (ρ10 .- ℓ0) (ρ20 .- ℓ0)) (h τ10 τ20)) -> ( forall (ℓ1 :: Symbol ) (τ11 :: k10) (τ21 :: k20) (ρ11 :: Row k10) (ρ21 :: Row k20). ( KnownSymbol ℓ1, c τ11 τ21, FrontExtends ℓ1 τ11 ρ11, FrontExtends ℓ1 τ21 ρ21, AllUniqueLabels ( Extend ℓ1 τ11 ρ11), AllUniqueLabels ( Extend ℓ1 τ21 ρ21)) => Label ℓ1 -> p (g ρ11 ρ21) (h τ11 τ21) -> g ( Extend ℓ1 τ11 ρ11) ( Extend ℓ1 τ21 ρ21)) -> f (' R ((ℓ :-> τ1) ': ρ1)) (' R ((ℓ :-> τ2) ': ρ2)) -> g (' R ((ℓ :-> τ1) ': ρ1)) (' R ((ℓ :-> τ2) ': ρ2)) Source # |
|
BiForall (' R ('[] :: [ LT k1]) :: Row k1) (' R ('[] :: [ LT k2]) :: Row k2) (c1 :: k1 -> k2 -> Constraint ) Source # | |
Defined in Data.Row.Internal biMetamorph :: forall p f g h. Bifunctor p => Proxy ( Proxy h, Proxy p) -> (f Empty Empty -> g Empty Empty ) -> ( forall (ℓ :: Symbol ) (τ1 :: k10) (τ2 :: k20) (ρ1 :: Row k10) (ρ2 :: Row k20). ( KnownSymbol ℓ, c1 τ1 τ2, HasType ℓ τ1 ρ1, HasType ℓ τ2 ρ2) => Label ℓ -> f ρ1 ρ2 -> p (f (ρ1 .- ℓ) (ρ2 .- ℓ)) (h τ1 τ2)) -> ( forall (ℓ :: Symbol ) (τ1 :: k10) (τ2 :: k20) (ρ1 :: Row k10) (ρ2 :: Row k20). ( KnownSymbol ℓ, c1 τ1 τ2, FrontExtends ℓ τ1 ρ1, FrontExtends ℓ τ2 ρ2, AllUniqueLabels ( Extend ℓ τ1 ρ1), AllUniqueLabels ( Extend ℓ τ2 ρ2)) => Label ℓ -> p (g ρ1 ρ2) (h τ1 τ2) -> g ( Extend ℓ τ1 ρ1) ( Extend ℓ τ2 ρ2)) -> f (' R '[]) (' R '[]) -> g (' R '[]) (' R '[]) Source # |
|
( KnownSymbol ℓ, c τ, Forall (' R ρ) c, FrontExtends ℓ τ (' R ρ), AllUniqueLabels ( Extend ℓ τ (' R ρ))) => Forall (' R ((ℓ :-> τ) ': ρ) :: Row k) (c :: k -> Constraint ) Source # | |
Defined in Data.Row.Internal metamorph :: forall p f g h. Bifunctor p => Proxy ( Proxy h, Proxy p) -> (f Empty -> g Empty ) -> ( forall (ℓ0 :: Symbol ) (τ0 :: k0) (ρ0 :: Row k0). ( KnownSymbol ℓ0, c τ0, HasType ℓ0 τ0 ρ0) => Label ℓ0 -> f ρ0 -> p (f (ρ0 .- ℓ0)) (h τ0)) -> ( forall (ℓ1 :: Symbol ) (τ1 :: k0) (ρ1 :: Row k0). ( KnownSymbol ℓ1, c τ1, FrontExtends ℓ1 τ1 ρ1, AllUniqueLabels ( Extend ℓ1 τ1 ρ1)) => Label ℓ1 -> p (g ρ1) (h τ1) -> g ( Extend ℓ1 τ1 ρ1)) -> f (' R ((ℓ :-> τ) ': ρ)) -> g (' R ((ℓ :-> τ) ': ρ)) Source # |
|
Forall (' R ('[] :: [ LT k]) :: Row k) (c :: k -> Constraint ) Source # | |
Defined in Data.Row.Internal metamorph :: forall p f g h. Bifunctor p => Proxy ( Proxy h, Proxy p) -> (f Empty -> g Empty ) -> ( forall (ℓ :: Symbol ) (τ :: k0) (ρ :: Row k0). ( KnownSymbol ℓ, c τ, HasType ℓ τ ρ) => Label ℓ -> f ρ -> p (f (ρ .- ℓ)) (h τ)) -> ( forall (ℓ :: Symbol ) (τ :: k0) (ρ :: Row k0). ( KnownSymbol ℓ, c τ, FrontExtends ℓ τ ρ, AllUniqueLabels ( Extend ℓ τ ρ)) => Label ℓ -> p (g ρ) (h τ) -> g ( Extend ℓ τ ρ)) -> f (' R '[]) -> g (' R '[]) Source # |
Elements stored in a Row type are usually hidden.
Row Operations
type family Extend (l :: Symbol ) (a :: k) (r :: Row k) :: Row k where ... Source #
Type level Row extension
type family Modify (l :: Symbol ) (a :: k) (r :: Row k) :: Row k where ... Source #
Type level Row modification
type family Rename (l :: Symbol ) (l' :: Symbol ) (r :: Row k) :: Row k where ... Source #
Type level row renaming
type (.==) (l :: Symbol ) (a :: k) = Extend l a Empty infix 7 Source #
A type level way to create a singleton Row.
type family (r :: Row k) .! (t :: Symbol ) :: k where ... infixl 5 Source #
Type level label fetching
type family (r :: Row k) .- (s :: Symbol ) :: Row k where ... infixl 6 Source #
Type level Row element removal
type family (l :: Row k) .\\ (r :: Row k) :: Row k where ... infixl 6 Source #
Type level Row difference. That is,
l
is the row remaining after
removing any matching elements of
.\\
r
r
from
l
.
Various row-type merges
The difference between
.+
(read "append"),
.\/
(read "min-join"), and
.\\
(read "const-union") comes down to how duplicates are handled.
In
.+
, the two given row-types must be entirely unique. Even the same
entry in both row-types is forbidden. In
.\/
, this final restriction is
relaxed, allowing two row-types that have no conflicts to be merged in the
logical way. The
.\\
operator is the most liberal, allowing any two row-types
to be merged together, and whenever there is a conflict, favoring the left argument.
As examples of use:
-
.+
is used when appending two records, assuring that those two records are entirely disjoint. -
.\/
is used when diversifying a variant, allowing some extension to the row-type so long as no original types have changed. -
.//
is used when doing record overwrite, allowing data in a record to totally overwrite what was previously there.
type family (l :: Row k) .\/ (r :: Row k) where ... infixl 6 Source #
The minimum join of the two rows.
type family (l :: Row k) .// (r :: Row k) where ... infixl 6 Source #
The overwriting union, where the left row overwrites the types of the right row where the labels overlap.
Row Constraints
class Lacks (l :: Symbol ) (r :: Row *) Source #
Alias for
.\
. It is a class rather than an alias, so that
it can be partially applied.
Instances
r .\ l => Lacks l r Source # | |
Defined in Data.Row.Internal |
type family (r :: Row k) .\ (l :: Symbol ) :: Constraint where ... infixl 4 Source #
Does the row lack (i.e. it does not have) the specified label?
( R '[]) .\ l = Unconstrained | |
( R r) .\ l = LacksR l r r |
class (r .! l) ≈ a => HasType l a r Source #
Alias for
(r .! l) ≈ a
. It is a class rather than an alias, so that
it can be partially applied.
class Forall (r :: Row k) (c :: k -> Constraint ) where Source #
Any structure over a row in which every element is similarly constrained can be metamorphized into another structure over the same row.
:: forall (p :: * -> * -> *) (f :: Row k -> *) (g :: Row k -> *) (h :: k -> *). Bifunctor p | |
=> Proxy ( Proxy h, Proxy p) | |
-> (f Empty -> g Empty ) |
The way to transform the empty element |
-> ( forall ℓ τ ρ. ( KnownSymbol ℓ, c τ, HasType ℓ τ ρ) => Label ℓ -> f ρ -> p (f (ρ .- ℓ)) (h τ)) |
The unfold |
-> ( forall ℓ τ ρ. ( KnownSymbol ℓ, c τ, FrontExtends ℓ τ ρ, AllUniqueLabels ( Extend ℓ τ ρ)) => Label ℓ -> p (g ρ) (h τ) -> g ( Extend ℓ τ ρ)) |
The fold |
-> f r |
The input structure |
-> g r |
A metamorphism is an anamorphism (an unfold) followed by a catamorphism (a fold).
The parameter
p
describes the output of the unfold and the input of the fold.
For records,
p = (,)
, because every entry in the row will unfold to a value paired
with the rest of the record.
For variants,
p = Either
, because there will either be a value or future types to
explore.
Const
can be useful when the types in the row are unnecessary.
Instances
( KnownSymbol ℓ, c τ, Forall (' R ρ) c, FrontExtends ℓ τ (' R ρ), AllUniqueLabels ( Extend ℓ τ (' R ρ))) => Forall (' R ((ℓ :-> τ) ': ρ) :: Row k) (c :: k -> Constraint ) Source # | |
Defined in Data.Row.Internal metamorph :: forall p f g h. Bifunctor p => Proxy ( Proxy h, Proxy p) -> (f Empty -> g Empty ) -> ( forall (ℓ0 :: Symbol ) (τ0 :: k0) (ρ0 :: Row k0). ( KnownSymbol ℓ0, c τ0, HasType ℓ0 τ0 ρ0) => Label ℓ0 -> f ρ0 -> p (f (ρ0 .- ℓ0)) (h τ0)) -> ( forall (ℓ1 :: Symbol ) (τ1 :: k0) (ρ1 :: Row k0). ( KnownSymbol ℓ1, c τ1, FrontExtends ℓ1 τ1 ρ1, AllUniqueLabels ( Extend ℓ1 τ1 ρ1)) => Label ℓ1 -> p (g ρ1) (h τ1) -> g ( Extend ℓ1 τ1 ρ1)) -> f (' R ((ℓ :-> τ) ': ρ)) -> g (' R ((ℓ :-> τ) ': ρ)) Source # |
|
Forall (' R ('[] :: [ LT k]) :: Row k) (c :: k -> Constraint ) Source # | |
Defined in Data.Row.Internal metamorph :: forall p f g h. Bifunctor p => Proxy ( Proxy h, Proxy p) -> (f Empty -> g Empty ) -> ( forall (ℓ :: Symbol ) (τ :: k0) (ρ :: Row k0). ( KnownSymbol ℓ, c τ, HasType ℓ τ ρ) => Label ℓ -> f ρ -> p (f (ρ .- ℓ)) (h τ)) -> ( forall (ℓ :: Symbol ) (τ :: k0) (ρ :: Row k0). ( KnownSymbol ℓ, c τ, FrontExtends ℓ τ ρ, AllUniqueLabels ( Extend ℓ τ ρ)) => Label ℓ -> p (g ρ) (h τ) -> g ( Extend ℓ τ ρ)) -> f (' R '[]) -> g (' R '[]) Source # |
class BiForall (r1 :: Row k1) (r2 :: Row k2) (c :: k1 -> k2 -> Constraint ) where Source #
Any structure over two rows in which the elements of each row satisfy some constraints can be metamorphized into another structure over both of the rows.
biMetamorph :: forall (p :: * -> * -> *) (f :: Row k1 -> Row k2 -> *) (g :: Row k1 -> Row k2 -> *) (h :: k1 -> k2 -> *). Bifunctor p => Proxy ( Proxy h, Proxy p) -> (f Empty Empty -> g Empty Empty ) -> ( forall ℓ τ1 τ2 ρ1 ρ2. ( KnownSymbol ℓ, c τ1 τ2, HasType ℓ τ1 ρ1, HasType ℓ τ2 ρ2) => Label ℓ -> f ρ1 ρ2 -> p (f (ρ1 .- ℓ) (ρ2 .- ℓ)) (h τ1 τ2)) -> ( forall ℓ τ1 τ2 ρ1 ρ2. ( KnownSymbol ℓ, c τ1 τ2, FrontExtends ℓ τ1 ρ1, FrontExtends ℓ τ2 ρ2, AllUniqueLabels ( Extend ℓ τ1 ρ1), AllUniqueLabels ( Extend ℓ τ2 ρ2)) => Label ℓ -> p (g ρ1 ρ2) (h τ1 τ2) -> g ( Extend ℓ τ1 ρ1) ( Extend ℓ τ2 ρ2)) -> f r1 r2 -> g r1 r2 Source #
A metamorphism is an anamorphism (an unfold) followed by a catamorphism (a fold).
Instances
( KnownSymbol ℓ, c τ1 τ2, BiForall (' R ρ1) (' R ρ2) c, FrontExtends ℓ τ1 (' R ρ1), FrontExtends ℓ τ2 (' R ρ2), AllUniqueLabels ( Extend ℓ τ1 (' R ρ1)), AllUniqueLabels ( Extend ℓ τ2 (' R ρ2))) => BiForall (' R ((ℓ :-> τ1) ': ρ1) :: Row k1) (' R ((ℓ :-> τ2) ': ρ2) :: Row k2) (c :: k1 -> k2 -> Constraint ) Source # | |
Defined in Data.Row.Internal biMetamorph :: forall p f g h. Bifunctor p => Proxy ( Proxy h, Proxy p) -> (f Empty Empty -> g Empty Empty ) -> ( forall (ℓ0 :: Symbol ) (τ10 :: k10) (τ20 :: k20) (ρ10 :: Row k10) (ρ20 :: Row k20). ( KnownSymbol ℓ0, c τ10 τ20, HasType ℓ0 τ10 ρ10, HasType ℓ0 τ20 ρ20) => Label ℓ0 -> f ρ10 ρ20 -> p (f (ρ10 .- ℓ0) (ρ20 .- ℓ0)) (h τ10 τ20)) -> ( forall (ℓ1 :: Symbol ) (τ11 :: k10) (τ21 :: k20) (ρ11 :: Row k10) (ρ21 :: Row k20). ( KnownSymbol ℓ1, c τ11 τ21, FrontExtends ℓ1 τ11 ρ11, FrontExtends ℓ1 τ21 ρ21, AllUniqueLabels ( Extend ℓ1 τ11 ρ11), AllUniqueLabels ( Extend ℓ1 τ21 ρ21)) => Label ℓ1 -> p (g ρ11 ρ21) (h τ11 τ21) -> g ( Extend ℓ1 τ11 ρ11) ( Extend ℓ1 τ21 ρ21)) -> f (' R ((ℓ :-> τ1) ': ρ1)) (' R ((ℓ :-> τ2) ': ρ2)) -> g (' R ((ℓ :-> τ1) ': ρ1)) (' R ((ℓ :-> τ2) ': ρ2)) Source # |
|
BiForall (' R ('[] :: [ LT k1]) :: Row k1) (' R ('[] :: [ LT k2]) :: Row k2) (c1 :: k1 -> k2 -> Constraint ) Source # | |
Defined in Data.Row.Internal biMetamorph :: forall p f g h. Bifunctor p => Proxy ( Proxy h, Proxy p) -> (f Empty Empty -> g Empty Empty ) -> ( forall (ℓ :: Symbol ) (τ1 :: k10) (τ2 :: k20) (ρ1 :: Row k10) (ρ2 :: Row k20). ( KnownSymbol ℓ, c1 τ1 τ2, HasType ℓ τ1 ρ1, HasType ℓ τ2 ρ2) => Label ℓ -> f ρ1 ρ2 -> p (f (ρ1 .- ℓ) (ρ2 .- ℓ)) (h τ1 τ2)) -> ( forall (ℓ :: Symbol ) (τ1 :: k10) (τ2 :: k20) (ρ1 :: Row k10) (ρ2 :: Row k20). ( KnownSymbol ℓ, c1 τ1 τ2, FrontExtends ℓ τ1 ρ1, FrontExtends ℓ τ2 ρ2, AllUniqueLabels ( Extend ℓ τ1 ρ1), AllUniqueLabels ( Extend ℓ τ2 ρ2)) => Label ℓ -> p (g ρ1 ρ2) (h τ1 τ2) -> g ( Extend ℓ τ1 ρ1) ( Extend ℓ τ2 ρ2)) -> f (' R '[]) (' R '[]) -> g (' R '[]) (' R '[]) Source # |
class (c1 x, c2 y) => BiConstraint c1 c2 x y Source #
A pair of constraints
Instances
(c1 x, c2 y) => BiConstraint (c1 :: k1 -> Constraint ) (c2 :: k2 -> Constraint ) (x :: k1) (y :: k2) Source # | |
Defined in Data.Row.Internal |
class Unconstrained Source #
A null constraint
Instances
Unconstrained Source # | |
Defined in Data.Row.Internal |
class Unconstrained1 a Source #
A null constraint of one argument
Instances
Unconstrained1 (a :: k) Source # | |
Defined in Data.Row.Internal |
class Unconstrained2 a b Source #
A null constraint of two arguments
Instances
Unconstrained2 (a :: k1) (b :: k2) Source # | |
Defined in Data.Row.Internal |
class FrontExtends l t r where Source #
A class wrapper for
FrontExtendsDict
.
frontExtendsDict :: FrontExtendsDict l t r Source #
Instances
(r ~ ' R ρ, ' R ((l :-> t) ': ρ) ≈ Extend l t (' R ρ), AllUniqueLabelsR ((l :-> t) ': ρ)) => FrontExtends l (t :: k) (r :: Row k) Source # | |
Defined in Data.Row.Internal frontExtendsDict :: FrontExtendsDict l t r Source # |
data FrontExtendsDict l t r Source #
A dictionary of information that proves that extending a row-type
r
with
a label
l
will necessarily put it to the front of the underlying row-type
list. This is quite internal and should not generally be necessary.
type WellBehaved ρ = ( Forall ρ Unconstrained1 , AllUniqueLabels ρ) Source #
A convenient way to provide common, easy constraints
type family AllUniqueLabels (r :: Row k) :: Constraint where ... Source #
Are all of the labels in this Row unique?
AllUniqueLabels ( R r) = AllUniqueLabelsR r |
type family Ap (fs :: Row (a -> b)) (r :: Row a) :: Row b where ... Source #
Take two rows with the same labels, and apply the type operator from the first row to the type of the second.
type family ApSingle (fs :: Row (a -> b)) (x :: a) :: Row b where ... Source #
Take a row of type operators and apply each to the second argument.
type family Zip (r1 :: Row *) (r2 :: Row *) where ... Source #
Zips two rows together to create a Row of the pairs. The two rows must have the same set of labels.
type family Map (f :: a -> b) (r :: Row a) :: Row b where ... Source #
Map a type level function over a Row.
type family Subset (r1 :: Row k) (r2 :: Row k) :: Constraint where ... Source #
Is the first row a subset of the second? Or, does the second row contain every binding that the first one does?
type Disjoint l r = ( WellBehaved l, WellBehaved r, Subset l (l .+ r), Subset r (l .+ r), ((l .+ r) .\\ l) ≈ r, ((l .+ r) .\\ r) ≈ l) Source #
A type synonym for disjointness.
Helper functions
labels :: forall ρ c s. ( IsString s, Forall ρ c) => [s] Source #
Return a list of the labels in a row type.
labels' :: forall ρ s. ( IsString s, Forall ρ Unconstrained1 ) => [s] Source #
Return a list of the labels in a row type and is specialized to the
Unconstrained1
constraint.