Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
The HList library
(C) 2004-2006, Oleg Kiselyov, Ralf Laemmel, Keean Schupke
Extensible records
The three-ish models of labels that go with this module;
These used to work:
Synopsis
- module Data.Tagged
- (.=.) :: Label l -> v -> Tagged l v
- newtype Record (r :: [*]) = Record (HList r)
- mkRecord :: HRLabelSet r => HList r -> Record r
- emptyRecord :: Record '[]
- hEndR :: Record a -> Record a
- hEndP :: Proxy (xs :: [k]) -> Proxy xs
- hListRecord :: forall {p} {f} {r :: [Type]} {r :: [Type]}. (Profunctor p, Functor f, HLabelSet (LabelsOf r), HAllTaggedLV r) => p (Record r) (f (Record r)) -> p (HList r) (f (HList r))
- hListRecord' :: forall {p} {f} {r :: [Type]}. (Profunctor p, Functor f, HLabelSet (LabelsOf r), HAllTaggedLV r) => p (Record r) (f (Record r)) -> p (HList r) (f (HList r))
- type family LabelsOf (ls :: [*]) :: [*]
- labelsOf :: hlistOrRecord l -> Proxy (LabelsOf l)
- asLabelsOf :: (HAllTaggedLV x, SameLabels x y, SameLength x y) => r x -> s y -> r x
- class SameLength r (RecordValuesR r) => RecordValues (r :: [*]) where
- type RecordValuesR r :: [*]
- recordValues' :: HList r -> HList (RecordValuesR r)
- recordValues :: RecordValues r => Record r -> HList (RecordValuesR r)
- hMapTaggedFn :: HMapTaggedFn a b => HList a -> Record b
- unlabeled0 :: forall {f} {p} {x :: [Type]} {y :: [Type]}. (Functor f, Profunctor p, SameLabels x y, HMapAux HList TaggedFn (RecordValuesR y) y, RecordValues x, RecordValues y) => p (HList (RecordValuesR x)) (f (HList (RecordValuesR y))) -> p (Record x) (f (Record y))
- type Unlabeled x y = (HMapCxt HList TaggedFn (RecordValuesR y) y, RecordValues x, RecordValues y, SameLength (RecordValuesR x) (RecordValuesR y), SameLength x y, SameLabels x y, HAllTaggedLV x, HAllTaggedLV y)
- unlabeled :: (Unlabeled x y, Profunctor p, Functor f) => (HList (RecordValuesR x) `p` f (HList (RecordValuesR y))) -> Record x `p` f (Record y)
- type Unlabeled' x = Unlabeled x x
- unlabeled' :: (Unlabeled' x, Profunctor p, Functor f) => (HList (RecordValuesR x) `p` f (HList (RecordValuesR x))) -> Record x `p` f (Record x)
- class ShowComponents l where
- showComponents :: String -> HList l -> String
- class ShowLabel l where
- (.*.) :: HExtend e l => e -> l -> HExtendR e l
- (.-.) :: HDeleteAtLabel r l xs xs' => r xs -> Label l -> r xs'
- class HDeleteLabels ks r r' | ks r -> r' where
- hDeleteLabels :: proxy (ks :: [*]) -> Record r -> Record r'
- class HLensCxt x r s t a b => HLens x r s t a b | x s b -> t, x t a -> s, x s -> a, x t -> b where
- class HasField (l :: k) r v | l r -> v where
- hLookupByLabel :: Label l -> r -> v
- class HasFieldM (l :: k) r (v :: Maybe *) | l r -> v where
- hLookupByLabelM :: Label l -> r -> t -> DemoteMaybe t v
- (.!.) :: HasField l r v => r -> Label l -> v
- (.@.) :: forall {k} {record} {l :: k} {v} {r :: [Type]} {r' :: [Type]}. (HUpdateAtLabel record l v r r', SameLength' r r', SameLength' r' r) => Tagged l v -> record r -> record r'
- class HUpdateAtLabel record (l :: k) (v :: *) (r :: [*]) (r' :: [*]) | l v r -> r', l r' -> v where
- hUpdateAtLabel :: SameLength r r' => Label l -> v -> record r -> record r'
- (.<.) :: forall {k} {record} {l :: k} {v} {r :: [Type]}. (HUpdateAtLabel record l v r r, SameLength' r r) => Tagged l v -> record r -> record r
- type HTPupdateAtLabel record l v r = (HUpdateAtLabel record l v r r, SameLength' r r)
- hTPupdateAtLabel :: HTPupdateAtLabel record l v r => Label l -> v -> record r -> record r
- hRenameLabel :: forall {k} {k} {r} {l :: k} {v :: [Type]} {v' :: [Type]} {v} {l :: k}. (HDeleteAtLabel r l v v', HasField l (r v) v, HExtend (Tagged l v) (r v')) => Label l -> Label l -> r v -> HExtendR (Tagged l v) (r v')
- type family Labels (xs :: [k]) :: *
- hProjectByLabels :: (HRLabelSet a, H2ProjectByLabels ls t a b) => proxy ls -> Record t -> Record a
- hProjectByLabels' :: forall {l :: [Type]} {r :: [Type]} {t :: [Type]} {b :: [Type]}. (HRearrange3 (LabelsOf l) r l, SameLength' r l, SameLength' r (LabelsOf l), SameLength' l r, SameLength' (LabelsOf l) r, HLabelSet (LabelsOf l), HLabelSet (LabelsOf r), HAllTaggedLV r, H2ProjectByLabels (LabelsOf l) t r b) => Record t -> Record l
- hProjectByLabels2 :: (H2ProjectByLabels ls t t1 t2, HRLabelSet t1, HRLabelSet t2) => Proxy ls -> Record t -> (Record t1, Record t2)
- class HLeftUnion r r' r'' | r r' -> r'' where
- hLeftUnion :: Record r -> Record r' -> Record r''
- (.<++.) :: HLeftUnion r r' r'' => Record r -> Record r' -> Record r''
- class UnionSymRec r1 r2 ru | r1 r2 -> ru where
- hRearrange :: (HLabelSet ls, HRearrange ls r r') => Proxy ls -> Record r -> Record r'
- hRearrange' :: forall {l :: [Type]} {r :: [Type]}. (HLabelSet (LabelsOf l), HRearrange3 (LabelsOf l) r l, SameLength' r l, SameLength' r (LabelsOf l), SameLength' l r, SameLength' (LabelsOf l) r) => Record r -> Record l
- class Rearranged r s t a b where
- rearranged :: (Profunctor p, Functor f) => (r a `p` f (r b)) -> r s `p` f (r t)
- rearranged' :: forall {k} {r} {t :: k} {b :: k} {p} {f}. (Rearranged r t t b b, Profunctor p, Functor f) => p (r b) (f (r b)) -> p (r t) (f (r t))
- hMapR :: forall {x :: [Type]} {y :: [Type]} {f}. (SameLength' x y, SameLength' y x, HMapAux HList (HFmap f) x y) => f -> Record x -> Record y
- newtype HMapR f = HMapR f
- class Relabeled r where
- relabeled :: forall p f s t a b. (HMapTaggedFn (RecordValuesR s) a, HMapTaggedFn (RecordValuesR b) t, SameLengths '[s, a, t, b], RecordValuesR t ~ RecordValuesR b, RecordValuesR s ~ RecordValuesR a, RecordValues b, RecordValues s, Profunctor p, Functor f) => (r a `p` f (r b)) -> r s `p` f (r t)
- relabeled' :: forall {t :: [Type]} {b :: [Type]} {r} {p} {f}. (RecordValuesR t ~ RecordValuesR b, Relabeled r, HMapAux HList TaggedFn (RecordValuesR t) b, HMapAux HList TaggedFn (RecordValuesR b) t, RecordValues b, RecordValues t, SameLength' t b, SameLength' t (RecordValuesR b), SameLength' b t, SameLength' b (RecordValuesR t), SameLength' (RecordValuesR t) b, SameLength' (RecordValuesR b) t, Profunctor p, Functor f) => p (r b) (f (r b)) -> p (r t) (f (r t))
- data DuplicatedLabel l
- type ExtraField x = ErrText "extra field" :<>: ErrShowType x
- type FieldNotFound key collection = (ErrText "key" :<>: ErrShowType key) :$$: (ErrText "could not be found in" :<>: ErrShowType collection)
- zipTagged :: (MapLabel ts ~ lts, HZip Proxy lts vs tvs) => Proxy ts -> proxy vs -> Proxy tvs
- class HasField' (b :: Bool) (l :: k) (r :: [*]) v | b l r -> v where
- hLookupByLabel' :: Proxy b -> Label l -> HList r -> v
- type family DemoteMaybe (d :: *) (v :: Maybe *) :: *
- class HasFieldM1 (b :: Maybe [*]) (l :: k) r v | b l r -> v where
- hLookupByLabelM1 :: Proxy b -> Label l -> r -> t -> DemoteMaybe t v
- class H2ProjectByLabels (ls :: [*]) r rin rout | ls r -> rin rout where
- h2projectByLabels :: proxy ls -> HList r -> (HList rin, HList rout)
- class H2ProjectByLabels' (b :: Maybe [*]) (ls :: [*]) r rin rout | b ls r -> rin rout where
- h2projectByLabels' :: Proxy b -> proxy ls -> HList r -> (HList rin, HList rout)
- class HLabelSet ls
- class HLabelSet' l1 l2 (leq :: Bool) r
- class (HLabelSet (LabelsOf ps), HAllTaggedLV ps) => HRLabelSet (ps :: [*])
- class HAllTaggedLV (ps :: [*])
- class (HRearrange3 ls r r', LabelsOf r' ~ ls, SameLength ls r, SameLength r r') => HRearrange (ls :: [*]) r r' | ls r -> r', r' -> ls where
- hRearrange2 :: proxy ls -> HList r -> HList r'
- class HRearrange3 (ls :: [*]) r r' | ls r -> r' where
- hRearrange3 :: proxy ls -> HList r -> HList r'
- class HRearrange4 (l :: *) (ls :: [*]) rin rout r' | l ls rin rout -> r' where
- hRearrange4 :: proxy l -> Proxy ls -> HList rin -> HList rout -> HList r'
- class UnionSymRec' (b :: Bool) r1 f2 r2' ru | b r1 f2 r2' -> ru where
- type HFindLabel (l :: k) (ls :: [*]) (n :: HNat) = HFind l (UnLabel l (LabelsOf ls)) n
- labelLVPair :: Tagged l v -> Label l
- newLVPair :: Label l -> v -> Tagged l v
- type family UnLabel (proxy :: k) (ls :: [*]) :: [k]
- type HMemberLabel l r b = HMember l (UnLabel l (LabelsOf r)) b
- data TaggedFn = TaggedFn
- data ReadComponent
- type HMapTaggedFn l r = (HMapCxt HList TaggedFn l r, RecordValuesR r ~ l, RecordValues r)
- type HLensCxt x r s t a b = (HasField x (r s) a, HUpdateAtLabel r x b s t, HasField x (r t) b, HUpdateAtLabel r x a t s, SameLength s t, SameLabels s t)
- class HZipRecord x y xy | x y -> xy, xy -> x y where
- hZipRecord :: Record x -> Record y -> Record xy
- hUnzipRecord :: Record xy -> (Record x, Record y)
- hZipRecord2 :: forall {x :: [Type]} {y :: [Type]} {y :: [Type]}. (SameLabels x y, SameLabels x y, HAllTaggedLV x, HMapAux HList TaggedFn (RecordValuesR x) x, HZipList (RecordValuesR y) (RecordValuesR y) (RecordValuesR x), RecordValues x, RecordValues y, RecordValues y, SameLength' x y, SameLength' x y, SameLength' y x, SameLength' y x) => Record y -> Record y -> Record x
- hUnzipRecord2 :: forall {x :: [Type]} {y :: [Type]} {x :: [Type]}. (SameLabels x y, SameLabels x y, HAllTaggedLV x, HAllTaggedLV x, HZipList (RecordValuesR x) (RecordValuesR x) (RecordValuesR y), HMapAux HList TaggedFn (RecordValuesR x) x, HMapAux HList TaggedFn (RecordValuesR x) x, RecordValues x, RecordValues y, RecordValues x, SameLength' x y, SameLength' x y, SameLength' y x, SameLength' y x) => Record y -> (Record x, Record x)
labels used for doctests
>>>
let x = Label :: Label "x"
>>>
let y = Label :: Label "y"
>>>
let z = Label :: Label "z"
Records
Labels
Record types as label-value pairs, where label is purely phantom. Thus the run-time representation of a field is the same as that of its value, and the record, at run-time, is indistinguishable from the HList of field values. At run-time, all information about the labels is erased.
The type from Data.Tagged is used.
module Data.Tagged
Record
newtype Record (r :: [*]) Source #
Instances
Relabeled Record Source # | |
Defined in Data.HList.Record relabeled :: forall p f (s :: [Type]) (t :: [Type]) (a :: [Type]) (b :: [Type]). (HMapTaggedFn (RecordValuesR s) a, HMapTaggedFn (RecordValuesR b) t, SameLengths '[s, a, t, b], RecordValuesR t ~ RecordValuesR b, RecordValuesR s ~ RecordValuesR a, RecordValues b, RecordValues s, Profunctor p, Functor f) => p (Record a) (f (Record b)) -> p (Record s) (f (Record t)) Source # | |
TypeIndexed Record TIP Source # | |
Defined in Data.HList.TIC | |
HMapAux HList (HFmap f) x y => HMapAux Record f x y Source # | |
(HZipRecord x y xy, SameLengths '[x, y, xy]) => HUnzip Record x y xy Source # | |
(HZipRecord x y xy, SameLengths '[x, y, xy]) => HZip Record x y xy Source # |
|
H2ProjectByLabels '[Label l] v t1 v' => HDeleteAtLabel Record (l :: k) v v' Source # | |
Defined in Data.HList.Record | |
(H2ProjectByLabels (LabelsOf a) s a_ _s_minus_a, HRLabelSet a_, HRLabelSet a, HRearrange (LabelsOf a) a_ a, HLeftUnion b s bs, HRLabelSet bs, HRearrange (LabelsOf t) bs t, HRLabelSet t) => Projected Record s t a b Source # | Lens rs rt ra rb where |
Defined in Data.HList.Labelable projected :: forall (ty :: LabeledOpticType) p f. (ty ~ LabelableTy Record, LabeledOpticP ty p, LabeledOpticF ty f) => p (Record a) (f (Record b)) -> p (Record s) (f (Record t)) Source # | |
(HUpdateAtLabel2 l v r r', HasField l (Record r') v) => HUpdateAtLabel Record (l :: k) v r r' Source # | |
Defined in Data.HList.Record | |
HLens x Record s t a b => Labelable (x :: k) Record s t a b Source # | make a |
Defined in Data.HList.Labelable type LabelableTy Record :: LabeledOpticType Source # | |
(t ~ (Any :: Type), Fail (FieldNotFound l ())) => HasField (l :: k) (Record ('[] :: [Type])) t Source # | XXX |
Defined in Data.HList.Record hLookupByLabel :: Label l -> Record '[] -> t Source # | |
(HEqK l l1 b, HasField' b l (Tagged l1 v1 ': r) v) => HasField (l :: k1) (Record (Tagged l1 v1 ': r)) v Source # | |
Defined in Data.HList.Record | |
H2ProjectByLabels (LabelsOf r2) r1 r2 rout => SubType (Record r1 :: Type) (Record r2 :: Type) Source # | Subtyping for records |
Defined in Data.HList.Record | |
(HReverse l lRev, HMapTaggedFn lRev l') => HBuild' l (Record l') Source # | This instance allows creating a Record with hBuild 3 |
HRLabelSet (t ': r) => HExtend t (Record r) Source # | |
(HLeftUnion lv x lvx, HRLabelSet x, HLabelSet (LabelsOf x), HRearrange (LabelsOf x) lvx x) => HUpdateMany lv (Record x) Source # | implementation in terms of |
Defined in Data.HList.RecordU | |
(HasField l (Record r) u, HasFieldPath needJust ls u v) => HasFieldPath needJust (Label l ': ls) (Record r) v Source # | |
Defined in Data.HList.Dredge | |
TypeRepsList (HList xs) => TypeRepsList (Record xs) Source # | |
Defined in Data.HList.Data typeRepsList :: Record xs -> [TypeRep] Source # | |
DataRecordCxt a => Data (Record a) Source # | |
Defined in Data.HList.Data gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Record a -> c (Record a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Record a) # toConstr :: Record a -> Constr # dataTypeOf :: Record a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Record a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Record a)) # gmapT :: (forall b. Data b => b -> b) -> Record a -> Record a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Record a -> r # gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Record a -> r # gmapQ :: (forall d. Data d => d -> u) -> Record a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Record a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Record a -> m (Record a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Record a -> m (Record a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Record a -> m (Record a) # | |
Monoid (HList r) => Monoid (Record r) Source # | |
Semigroup (HList r) => Semigroup (Record r) Source # | |
Bounded (HList r) => Bounded (Record r) Source # | |
Ix (HList r) => Ix (Record r) Source # | |
Defined in Data.HList.Record | |
(HMapCxt HList ReadComponent (AddProxy rs) bs, ApplyAB ReadComponent (Proxy r) readP_r, HProxies rs, HSequence ReadP (readP_r ': bs) (r ': rs), readP_r ~ ReadP (Tagged l v), r ~ Tagged l v, ShowLabel l, Read v, HSequence ReadP bs rs) => Read (Record (r ': rs)) Source # | |
ShowComponents r => Show (Record r) Source # | |
Eq (HList r) => Eq (Record r) Source # | |
Ord (HList r) => Ord (Record r) Source # | |
Defined in Data.HList.Record | |
(la ~ LabelsOf a, lt ~ LabelsOf t, HRearrange la s a, HRearrange lt b t, HLabelSet la, HLabelSet lt) => Rearranged Record (s :: [Type]) (t :: [Type]) (a :: [Type]) (b :: [Type]) Source # | Iso (Record s) (Record t) (Record a) (Record b) where An alternative implementation: rearranged x = iso hRearrange' hRearrange' x |
Defined in Data.HList.Record rearranged :: (Profunctor p, Functor f) => p (Record a) (f (Record b)) -> p (Record s) (f (Record t)) Source # | |
(HRLabelSet (HAppendListR r1 r2), HAppend (HList r1) (HList r2)) => HAppend (Record r1) (Record r2) Source # |
record .*. field1 .*. field2 |
type LabelableTy Record Source # | |
Defined in Data.HList.Labelable | |
type HExtendR t (Record r) Source # | |
Defined in Data.HList.Record | |
type HAppendR (Record r1 :: Type) (Record r2 :: Type) Source # | |
Defined in Data.HList.Record |
emptyRecord :: Record '[] Source #
Build an empty record
hEndP :: Proxy (xs :: [k]) -> Proxy xs Source #
hEndP
$hBuild
label1 label2
is one way to make a Proxy of labels (for use with asLabelsOf
for example). Another way is
label1 .*. label2 .*. emptyProxy
hListRecord :: forall {p} {f} {r :: [Type]} {r :: [Type]}. (Profunctor p, Functor f, HLabelSet (LabelsOf r), HAllTaggedLV r) => p (Record r) (f (Record r)) -> p (HList r) (f (HList r)) Source #
HRLabelSet t => Iso (HList s) (HList t) (Record s) (Record t)
hListRecord' :: forall {p} {f} {r :: [Type]}. (Profunctor p, Functor f, HLabelSet (LabelsOf r), HAllTaggedLV r) => p (Record r) (f (Record r)) -> p (HList r) (f (HList r)) Source #
Iso' (HList s) (Record s)
Getting Labels
type family LabelsOf (ls :: [*]) :: [*] Source #
Construct the (phantom) list of labels of a record, or list of Label.
Instances
type LabelsOf ('[] :: [Type]) Source # | |
Defined in Data.HList.Record | |
type LabelsOf (Label l ': r) Source # | |
Defined in Data.HList.Record | |
type LabelsOf (Tagged l v ': r) Source # | |
Defined in Data.HList.Record |
asLabelsOf :: (HAllTaggedLV x, SameLabels x y, SameLength x y) => r x -> s y -> r x Source #
similar to asTypeOf
:
>>>
let s0 = Proxy :: Proxy '["x", "y"]
>>>
let s1 = Proxy :: Proxy '[Label "x", Label "y"]
>>>
let s2 = Proxy :: Proxy '[Tagged "x" Int, Tagged "y" Char]
>>>
let f0 r = () where _ = r `asLabelsOf` s0
>>>
let f1 r = () where _ = r `asLabelsOf` s1
>>>
let f2 r = () where _ = r `asLabelsOf` s2
>>>
:t f0
f0 :: r '[Tagged "x" v, Tagged "y" v1] -> ()
>>>
:t f1
f1 :: r '[Tagged "x" v, Tagged "y" v1] -> ()
>>>
:t f2
f2 :: r '[Tagged "x" v, Tagged "y" v1] -> ()
Getting Values
class SameLength r (RecordValuesR r) => RecordValues (r :: [*]) where Source #
Construct the HList of values of the record.
type RecordValuesR r :: [*] Source #
recordValues' :: HList r -> HList (RecordValuesR r) Source #
Instances
RecordValues ('[] :: [Type]) Source # | |
Defined in Data.HList.Record type RecordValuesR '[] :: [Type] Source # recordValues' :: HList '[] -> HList (RecordValuesR '[]) Source # | |
(SameLength' r (RecordValuesR r), SameLength' (RecordValuesR r) r, RecordValues r) => RecordValues (Tagged l v ': r) Source # | |
Defined in Data.HList.Record type RecordValuesR (Tagged l v ': r) :: [Type] Source # recordValues' :: HList (Tagged l v ': r) -> HList (RecordValuesR (Tagged l v ': r)) Source # |
recordValues :: RecordValues r => Record r -> HList (RecordValuesR r) Source #
hMapTaggedFn :: HMapTaggedFn a b => HList a -> Record b Source #
"inverse" to recordValues
unlabeled0 :: forall {f} {p} {x :: [Type]} {y :: [Type]}. (Functor f, Profunctor p, SameLabels x y, HMapAux HList TaggedFn (RecordValuesR y) y, RecordValues x, RecordValues y) => p (HList (RecordValuesR x)) (f (HList (RecordValuesR y))) -> p (Record x) (f (Record y)) Source #
Iso (Record s) (Record t) (HList a) (HList b)
view unlabeled == recordValues
type Unlabeled x y = (HMapCxt HList TaggedFn (RecordValuesR y) y, RecordValues x, RecordValues y, SameLength (RecordValuesR x) (RecordValuesR y), SameLength x y, SameLabels x y, HAllTaggedLV x, HAllTaggedLV y) Source #
unlabeled :: (Unlabeled x y, Profunctor p, Functor f) => (HList (RecordValuesR x) `p` f (HList (RecordValuesR y))) -> Record x `p` f (Record y) Source #
type Unlabeled' x = Unlabeled x x Source #
unlabeled' :: (Unlabeled' x, Profunctor p, Functor f) => (HList (RecordValuesR x) `p` f (HList (RecordValuesR x))) -> Record x `p` f (Record x) Source #
Unlabeled' x => Iso' (Record x) (HList (RecordValuesR x))
Operations
Show
A corresponding Show
instance exists as
show x = "Record {" ++ showComponents "" x ++ "}"
class ShowComponents l where Source #
Instances
ShowComponents ('[] :: [Type]) Source # | |
Defined in Data.HList.Record | |
(ShowLabel l, Show v, ShowComponents r) => ShowComponents (Tagged l v ': r) Source # | |
Defined in Data.HList.Record |
class ShowLabel l where Source #
Instances
Extension
hExtend
, hAppend
Delete
hDeleteAtLabel
label record
(.-.) :: HDeleteAtLabel r l xs xs' => r xs -> Label l -> r xs' infixl 2 Source #
Remove a field from a record. At the same
level as other record modification options (.*.
). Analagous
to (\\
) in lists.
record1 .-. label1
label1 .=. value1 .*. label2 .=. value2 .-. label2 .*. emptyRecord
label1 .=. value1 .-. label1 .*. label2 .=. value2 .*. emptyRecord
record1 .*. label1 .=. record2 .!. label1 .*. label2 .=. record2 .!. label2 .-. label1
class HDeleteLabels ks r r' | ks r -> r' where Source #
Instances
HDeleteLabels ks ('[] :: [Type]) ('[] :: [Type]) Source # | |
Defined in Data.HList.Record hDeleteLabels :: proxy ks -> Record '[] -> Record '[] Source # | |
(HMember (Label l) ks b, HCond b (Record r2) (Record (Tagged l v ': r2)) (Record r3), HDeleteLabels ks r1 r2) => HDeleteLabels ks (Tagged l v ': r1) r3 Source # | |
Defined in Data.HList.Record |
Lookup/update
Lens-based setters/getters are popular. hLens packages up
hUpdateAtLabel
and hLookupByLabel
.
Refer to examples/lens.hs
and examples/labelable.hs
for examples.
class HLensCxt x r s t a b => HLens x r s t a b | x s b -> t, x t a -> s, x s -> a, x t -> b where Source #
Lookup
class HasField (l :: k) r v | l r -> v where Source #
This is a baseline implementation. We use a helper class, HasField, to abstract from the implementation.
Because hLookupByLabel
is so frequent and important, we implement
it separately, more efficiently. The algorithm is familiar assq, only
the comparison operation is done at compile-time
hLookupByLabel :: Label l -> r -> v Source #
Instances
class HasFieldM (l :: k) r (v :: Maybe *) | l r -> v where Source #
a version of HasField
hLookupByLabel
.!.
that
returns a default value when the label is not in the record:
>>>
let r = x .=. "the x value" .*. emptyRecord
>>>
hLookupByLabelM y r ()
()
>>>
hLookupByLabelM x r ()
"the x value"
:: Label l | |
-> r | Record (or Variant,TIP,TIC) |
-> t | default value |
-> DemoteMaybe t v |
Instances
(HMemberM (Label l) (LabelsOf xs) b, HasFieldM1 b l (r xs) v) => HasFieldM (l :: k) (r xs) v Source # | |
Defined in Data.HList.Record hLookupByLabelM :: Label l -> r xs -> t -> DemoteMaybe t v Source # |
(.!.) :: HasField l r v => r -> Label l -> v infixr 9 Source #
Lookup a value in a record by its label. Analagous to (!!), the
list indexing operation. Highest fixity, like (!!
).
>>>
:{
let record1 = x .=. 3 .*. y .=. 'y' .*. emptyRecord :}
>>>
record1 .!. x
3
>>>
record1 .!. y
'y'
>>>
:{
let r2 = y .=. record1 .!. x .*. z .=. record1 .!. y .*. emptyRecord :}
>>>
r2
Record{y=3,z='y'}
Note that labels made following Data.HList.Labelable allow using "Control.Lens.^." instead.
Update
(.@.) :: forall {k} {record} {l :: k} {v} {r :: [Type]} {r' :: [Type]}. (HUpdateAtLabel record l v r r', SameLength' r r', SameLength' r' r) => Tagged l v -> record r -> record r' infixr 2 Source #
Update a field with a particular value. Same fixity as (.*.) so that extensions and updates can be chained. There is no real list analogue, since there is no Prelude defined update.
label1 .=. value1 .@. record1
class HUpdateAtLabel record (l :: k) (v :: *) (r :: [*]) (r' :: [*]) | l v r -> r', l r' -> v where Source #
hUpdateAtLabel
label value record
hUpdateAtLabel :: SameLength r r' => Label l -> v -> record r -> record r' Source #
Instances
(HUpdateAtLabel Record e' e r r', HTypeIndexed r', e ~ e') => HUpdateAtLabel TIP (e' :: Type) e r r' Source # | |
Defined in Data.HList.TIP | |
(HUpdateAtLabel2 l v r r', HasField l (Record r') v) => HUpdateAtLabel Record (l :: k) v r r' Source # | |
Defined in Data.HList.Record | |
(r ~ r', v ~ GetElemTy r, HFindLabel l r n, HNat2Integral n, IArray UArray v, HasField l (Record r') v) => HUpdateAtLabel RecordU (l :: k) v r r' Source # | |
Defined in Data.HList.RecordU | |
HUpdateVariantAtLabelCxt l e v v' n _e => HUpdateAtLabel Variant (l :: k) e v v' Source # | hUpdateAtLabel x e' (mkVariant x e proxy) == mkVariant x e' proxy hUpdateAtLabel y e' (mkVariant x e proxy) == mkVariant x e proxy |
Defined in Data.HList.Variant |
type-preserving versions
Note: these restrict the resulting record type to be the same as in input record type, which can help reduce the number of type annotations needed
(.<.) :: forall {k} {record} {l :: k} {v} {r :: [Type]}. (HUpdateAtLabel record l v r r, SameLength' r r) => Tagged l v -> record r -> record r infixr 2 Source #
The same as .@.
, except type preserving. It has the same fixity as (.@.).
type HTPupdateAtLabel record l v r = (HUpdateAtLabel record l v r r, SameLength' r r) Source #
hTPupdateAtLabel :: HTPupdateAtLabel record l v r => Label l -> v -> record r -> record r Source #
We could also say:
hTPupdateAtLabel l v r = hUpdateAtLabel l v r `asTypeOf` r
Then we were taking a dependency on Haskell's type equivalence. This would also constrain the actual implementation of hUpdateAtLabel.
A variation on hUpdateAtLabel
: type-preserving update.
Rename Label
hRenameLabel :: forall {k} {k} {r} {l :: k} {v :: [Type]} {v' :: [Type]} {v} {l :: k}. (HDeleteAtLabel r l v v', HasField l (r v) v, HExtend (Tagged l v) (r v')) => Label l -> Label l -> r v -> HExtendR (Tagged l v) (r v') Source #
Rename the label of record
>>>
hRenameLabel x y (x .=. () .*. emptyRecord)
Record{y=()}
Projection
type family Labels (xs :: [k]) :: * Source #
A helper to make the Proxy needed by hProjectByLabels, and similar functions which accept a list of kind [*].
For example:
(rin,rout) = hProjectByLabels2
(Proxy :: Labels ["x","y"]) r
behaves like
rin = r .!. (Label :: Label "x") .*. r .!. (Label :: Label "y") .*. emptyRecord rout = r .-. (Label :: Label "x") .-. (Label :: Label "y")
Instances
type Labels (xs :: [k]) Source # | |
Defined in Data.HList.Record type Labels (xs :: [k]) |
It is also an important operation: the basis of many deconstructors -- so we try to implement it efficiently.
hProjectByLabels :: (HRLabelSet a, H2ProjectByLabels ls t a b) => proxy ls -> Record t -> Record a Source #
hProjectByLabels ls r
returns r
with only the labels in ls
remaining
hProjectByLabels' :: forall {l :: [Type]} {r :: [Type]} {t :: [Type]} {b :: [Type]}. (HRearrange3 (LabelsOf l) r l, SameLength' r l, SameLength' r (LabelsOf l), SameLength' l r, SameLength' (LabelsOf l) r, HLabelSet (LabelsOf l), HLabelSet (LabelsOf r), HAllTaggedLV r, H2ProjectByLabels (LabelsOf l) t r b) => Record t -> Record l Source #
hProjectByLabels2 :: (H2ProjectByLabels ls t t1 t2, HRLabelSet t1, HRLabelSet t2) => Proxy ls -> Record t -> (Record t1, Record t2) Source #
a lens for projection
see Data.HList.Labelable.Projected
Unions
Left
class HLeftUnion r r' r'' | r r' -> r'' where Source #
Instances
(HDeleteLabels (LabelsOf l) r r', HAppend (Record l) (Record r'), HAppendR (Record l) (Record r') ~ Record lr) => HLeftUnion l r lr Source # | |
Defined in Data.HList.Record |
(.<++.) :: HLeftUnion r r' r'' => Record r -> Record r' -> Record r'' infixl 1 Source #
Similar to list append, so give this slightly lower fixity than (.*.), so we can write:
field1 .=. value .*. record1 .<++. record2
Symmetric
Compute the symmetric union of two records r1 and r2 and return the pair of records injected into the union (ru1, ru2).
To be more precise, we compute the symmetric union type ru
of two record types r1
and r2
. The emphasis on types is important.
The two records (ru1,ru2) in the result of unionSR
have the same
type ru, but they are generally different values.
Here the simple example: suppose
r1 = (Label .=. True) .*. emptyRecord r2 = (Label .=. False) .*. emptyRecord
Then unionSR
r1 r2 will return (r1,r2). Both components of the result
are different records of the same type.
To project from the union ru, use hProjectByLabels
.
It is possible to project from the union obtaining a record
that was not used at all when creating the union.
We do assure however that if unionSR r1 r2
gave (r1u,r2u)
,
then projecting r1u onto the type of r1 gives the value identical
to r1. Ditto for r2.
class UnionSymRec r1 r2 ru | r1 r2 -> ru where Source #
Instances
r1 ~ r1' => UnionSymRec r1 ('[] :: [Type]) r1' Source # | |
(HMemberLabel l r1 b, UnionSymRec' b r1 (Tagged l v) r2' ru) => UnionSymRec r1 (Tagged l v ': r2') ru Source # | |
Reorder Labels
hRearrange :: (HLabelSet ls, HRearrange ls r r') => Proxy ls -> Record r -> Record r' Source #
Rearranges a record by labels. Returns the record r, rearranged such that the labels are in the order given by ls. (LabelsOf r) must be a permutation of ls.
hRearrange' :: forall {l :: [Type]} {r :: [Type]}. (HLabelSet (LabelsOf l), HRearrange3 (LabelsOf l) r l, SameLength' r l, SameLength' r (LabelsOf l), SameLength' l r, SameLength' (LabelsOf l) r) => Record r -> Record l Source #
hRearrange'
is hRearrange
where ordering specified by the Proxy
argument is determined by the result type.
With built-in haskell records, these e1
and e2
have the same type:
data R = R { x, y :: Int } e1 = R{ x = 1, y = 2} e2 = R{ y = 2, x = 1}
hRearrange'
can be used to allow either ordering to be accepted:
h1, h2 :: Record [ Tagged "x" Int, Tagged "y" Int ] h1 = hRearrange' $ x .=. 1 .*. y .=. 2 .*. emptyRecord h2 = hRearrange' $ y .=. 2 .*. x .=. 1 .*. emptyRecord
isos using hRearrange
class Rearranged r s t a b where Source #
rearranged :: (Profunctor p, Functor f) => (r a `p` f (r b)) -> r s `p` f (r t) Source #
Instances
(la ~ LabelsOf a, lt ~ LabelsOf t, HRearrange la s a, HRearrange lt b t, HLabelSet la, HLabelSet lt) => Rearranged Record (s :: [Type]) (t :: [Type]) (a :: [Type]) (b :: [Type]) Source # | Iso (Record s) (Record t) (Record a) (Record b) where An alternative implementation: rearranged x = iso hRearrange' hRearrange' x |
Defined in Data.HList.Record rearranged :: (Profunctor p, Functor f) => p (Record a) (f (Record b)) -> p (Record s) (f (Record t)) Source # | |
(SameLength s a, ExtendsVariant s a, SameLength b t, ExtendsVariant b t) => Rearranged Variant (s :: [Type]) (t :: [Type]) (a :: [Type]) (b :: [Type]) Source # | |
Defined in Data.HList.Variant rearranged :: (Profunctor p, Functor f) => p (Variant a) (f (Variant b)) -> p (Variant s) (f (Variant t)) Source # |
rearranged' :: forall {k} {r} {t :: k} {b :: k} {p} {f}. (Rearranged r t t b b, Profunctor p, Functor f) => p (r b) (f (r b)) -> p (r t) (f (r t)) Source #
Iso' (r s) (r a)
where s
is a permutation of a
Apply a function to all values
hMapR :: forall {x :: [Type]} {y :: [Type]} {f}. (SameLength' x y, SameLength' y x, HMapAux HList (HFmap f) x y) => f -> Record x -> Record y Source #
map over the values of a record. This is a shortcut for
\ f (Record a) -> Record (hMap (HFmap f) a)
Example
suppose we have a function that should be applied to every element of a record:
>>>
let circSucc_ x | x == maxBound = minBound | otherwise = succ x
>>>
:t circSucc_
circSucc_ :: (Bounded a, Enum a, Eq a) => a -> a
Use a shortcut (Fun
) to create a value that has an appropriate ApplyAB
instance:
>>>
let circSucc = Fun circSucc_ :: Fun '[Eq,Enum,Bounded] '()
Confirm that we got Fun right:
>>>
:t applyAB circSucc
applyAB circSucc :: (Bounded b, Enum b, Eq b) => b -> b
>>>
applyAB circSucc True
False
define the actual record:
>>>
let r = x .=. 'a' .*. y .=. False .*. emptyRecord
>>>
r
Record{x='a',y=False}
>>>
hMapR circSucc r
Record{x='b',y=True}
HMapR f |
cast labels
class Relabeled r where Source #
Iso (Record s) (Record t) (Record a) (Record b)
, such that
relabeled = unlabeled . from unlabeled
in other words, pretend a record has different labels, but the same values.
relabeled :: forall p f s t a b. (HMapTaggedFn (RecordValuesR s) a, HMapTaggedFn (RecordValuesR b) t, SameLengths '[s, a, t, b], RecordValuesR t ~ RecordValuesR b, RecordValuesR s ~ RecordValuesR a, RecordValues b, RecordValues s, Profunctor p, Functor f) => (r a `p` f (r b)) -> r s `p` f (r t) Source #
Instances
Relabeled Record Source # | |
Defined in Data.HList.Record relabeled :: forall p f (s :: [Type]) (t :: [Type]) (a :: [Type]) (b :: [Type]). (HMapTaggedFn (RecordValuesR s) a, HMapTaggedFn (RecordValuesR b) t, SameLengths '[s, a, t, b], RecordValuesR t ~ RecordValuesR b, RecordValuesR s ~ RecordValuesR a, RecordValues b, RecordValues s, Profunctor p, Functor f) => p (Record a) (f (Record b)) -> p (Record s) (f (Record t)) Source # | |
Relabeled Variant Source # | |
Defined in Data.HList.Variant relabeled :: forall p f (s :: [Type]) (t :: [Type]) (a :: [Type]) (b :: [Type]). (HMapTaggedFn (RecordValuesR s) a, HMapTaggedFn (RecordValuesR b) t, SameLengths '[s, a, t, b], RecordValuesR t ~ RecordValuesR b, RecordValuesR s ~ RecordValuesR a, RecordValues b, RecordValues s, Profunctor p, Functor f) => p (Variant a) (f (Variant b)) -> p (Variant s) (f (Variant t)) Source # |
relabeled' :: forall {t :: [Type]} {b :: [Type]} {r} {p} {f}. (RecordValuesR t ~ RecordValuesR b, Relabeled r, HMapAux HList TaggedFn (RecordValuesR t) b, HMapAux HList TaggedFn (RecordValuesR b) t, RecordValues b, RecordValues t, SameLength' t b, SameLength' t (RecordValuesR b), SameLength' b t, SameLength' b (RecordValuesR t), SameLength' (RecordValuesR t) b, SameLength' (RecordValuesR b) t, Profunctor p, Functor f) => p (r b) (f (r b)) -> p (r t) (f (r t)) Source #
Iso' (Record s) (Record a)
such that RecordValuesR s ~ RecordValuesR a
Hints for type errors
data DuplicatedLabel l Source #
Property of a proper label set for a record: no duplication of labels,
and every element of the list is Tagged label value
type ExtraField x = ErrText "extra field" :<>: ErrShowType x Source #
type FieldNotFound key collection = (ErrText "key" :<>: ErrShowType key) :$$: (ErrText "could not be found in" :<>: ErrShowType collection) Source #
Unclassified
Probably internals, that may not be useful
zipTagged :: (MapLabel ts ~ lts, HZip Proxy lts vs tvs) => Proxy ts -> proxy vs -> Proxy tvs Source #
Missing from ghc-7.6, because HZip Proxy instances interfere with HZip HList instances.
a variation on hZip
for Proxy
, where
the list of labels does not have to include Label
(as in ts'
)
>>>
let ts = Proxy :: Proxy ["x","y"]
>>>
let ts' = Proxy :: Proxy [Label "x",Label "y"]
>>>
let vs = Proxy :: Proxy [Int,Char]
>>>
:t zipTagged ts Proxy
zipTagged ts Proxy :: Proxy '[Tagged "x" y, Tagged "y" y1]
>>>
:t zipTagged ts vs
zipTagged ts vs :: Proxy '[Tagged "x" Int, Tagged "y" Char]
And and the case when hZip does the same thing:
>>>
:t zipTagged ts' vs
zipTagged ts' vs :: Proxy '[Tagged "x" Int, Tagged "y" Char]
>>>
:t hZip ts' vs
hZip ts' vs :: Proxy '[Tagged "x" Int, Tagged "y" Char]
class HasField' (b :: Bool) (l :: k) (r :: [*]) v | b l r -> v where Source #
type family DemoteMaybe (d :: *) (v :: Maybe *) :: * Source #
Instances
type DemoteMaybe d ('Nothing :: Maybe Type) Source # | |
Defined in Data.HList.Record | |
type DemoteMaybe d ('Just a) Source # | |
Defined in Data.HList.Record |
class HasFieldM1 (b :: Maybe [*]) (l :: k) r v | b l r -> v where Source #
hLookupByLabelM1 :: Proxy b -> Label l -> r -> t -> DemoteMaybe t v Source #
Instances
HasFieldM1 ('Nothing :: Maybe [Type]) (l :: k) r ('Nothing :: Maybe Type) Source # | |
Defined in Data.HList.Record hLookupByLabelM1 :: Proxy 'Nothing -> Label l -> r -> t -> DemoteMaybe t 'Nothing Source # | |
HasField l r v => HasFieldM1 ('Just b) (l :: k) r ('Just v) Source # | |
Defined in Data.HList.Record hLookupByLabelM1 :: Proxy ('Just b) -> Label l -> r -> t -> DemoteMaybe t ('Just v) Source # |
class H2ProjectByLabels (ls :: [*]) r rin rout | ls r -> rin rout where Source #
Invariant:
r === rin `disjoint-union` rout labels rin === ls where (rin,rout) = hProjectByLabels ls r
Instances
H2ProjectByLabels ('[] :: [Type]) r ('[] :: [Type]) r Source # | |
Defined in Data.HList.Record | |
H2ProjectByLabels (l ': ls) ('[] :: [Type]) ('[] :: [Type]) ('[] :: [Type]) Source # | |
Defined in Data.HList.Record | |
(HMemberM (Label l1) (l ': ls) b, H2ProjectByLabels' b (l ': ls) (Tagged l1 v1 ': r1) rin rout) => H2ProjectByLabels (l ': ls) (Tagged l1 v1 ': r1) rin rout Source # | |
Defined in Data.HList.Record |
class H2ProjectByLabels' (b :: Maybe [*]) (ls :: [*]) r rin rout | b ls r -> rin rout where Source #
Instances
H2ProjectByLabels ls r rin rout => H2ProjectByLabels' ('Nothing :: Maybe [Type]) ls (f ': r) rin (f ': rout) Source # | if ls above has labels not in the record,
we get labels (rin |
Defined in Data.HList.Record | |
H2ProjectByLabels ls1 r rin rout => H2ProjectByLabels' ('Just ls1) ls (f ': r) (f ': rin) rout Source # | |
Defined in Data.HList.Record |
Relation between HLabelSet and HRLabelSet
instance HLabelSet (LabelsOf ps) => HRLabelSet ps
see also HSet
Instances
HLabelSet ('[] :: [k]) Source # | |
Defined in Data.HList.Record | |
(HEqK l1 l2 leq, HLabelSet' l1 l2 leq r) => HLabelSet (l1 ': (l2 ': r) :: [a]) Source # | |
Defined in Data.HList.Record | |
HLabelSet ('[x] :: [k]) Source # | |
Defined in Data.HList.Record |
class HLabelSet' l1 l2 (leq :: Bool) r Source #
Instances
Fail (DuplicatedLabel l1) => HLabelSet' (l1 :: k1) (l2 :: k2) 'True (r :: k3) Source # | |
Defined in Data.HList.Record | |
(HLabelSet (l2 ': r), HLabelSet (l1 ': r)) => HLabelSet' (l1 :: k) (l2 :: k) 'False (r :: [k]) Source # | |
Defined in Data.HList.Record |
class (HLabelSet (LabelsOf ps), HAllTaggedLV ps) => HRLabelSet (ps :: [*]) Source #
Instances
(HLabelSet (LabelsOf ps), HAllTaggedLV ps) => HRLabelSet ps Source # | |
Defined in Data.HList.Record |
class HAllTaggedLV (ps :: [*]) Source #
The Record
, Variant
, TIP
, TIC
type constructors only make
sense when they are applied to an instance of this class
Instances
HAllTaggedLV ('[] :: [Type]) Source # | |
Defined in Data.HList.FakePrelude | |
(HAllTaggedLV xs, x ~ Tagged t v) => HAllTaggedLV (x ': xs) Source # | |
Defined in Data.HList.FakePrelude |
class (HRearrange3 ls r r', LabelsOf r' ~ ls, SameLength ls r, SameLength r r') => HRearrange (ls :: [*]) r r' | ls r -> r', r' -> ls where Source #
Helper class for hRearrange
hRearrange2 :: proxy ls -> HList r -> HList r' Source #
Instances
(HRearrange3 ls r r', LabelsOf r' ~ ls, SameLength ls r, SameLength r r') => HRearrange ls r r' Source # | |
Defined in Data.HList.Record hRearrange2 :: proxy ls -> HList r -> HList r' Source # |
class HRearrange3 (ls :: [*]) r r' | ls r -> r' where Source #
same as HRearrange, except no backwards FD
hRearrange3 :: proxy ls -> HList r -> HList r' Source #
Instances
HRearrange3 ('[] :: [Type]) ('[] :: [Type]) ('[] :: [Type]) Source # | |
Defined in Data.HList.Record hRearrange3 :: proxy '[] -> HList '[] -> HList '[] Source # | |
Fail (ExtraField l) => HRearrange3 ('[] :: [Type]) (Tagged l v ': a) ('[] :: [Type]) Source # | For improved error messages |
Defined in Data.HList.Record | |
(H2ProjectByLabels '[l] r rin rout, HRearrange4 l ls rin rout r', l ~ Label ll) => HRearrange3 (l ': ls) r r' Source # | |
Defined in Data.HList.Record hRearrange3 :: proxy (l ': ls) -> HList r -> HList r' Source # |
class HRearrange4 (l :: *) (ls :: [*]) rin rout r' | l ls rin rout -> r' where Source #
Helper class 2 for hRearrange
Instances
Fail (FieldNotFound l ()) => HRearrange4 l ls ('[] :: [Type]) rout ('[] :: [Type]) Source # | For improved error messages. XXX FieldNotFound |
Defined in Data.HList.Record | |
(HRearrange3 ls rout r', r'' ~ (Tagged l v ': r'), ll ~ Label l) => HRearrange4 ll ls '[Tagged l v] rout r'' Source # | |
Defined in Data.HList.Record |
class UnionSymRec' (b :: Bool) r1 f2 r2' ru | b r1 f2 r2' -> ru where Source #
Instances
(UnionSymRec r1 r2' ru, HExtend f2 (Record ru), Record f2ru ~ HExtendR f2 (Record ru)) => UnionSymRec' 'False r1 f2 r2' f2ru Source # | |
(UnionSymRec r1 r2' ru, HTPupdateAtLabel Record l2 v2 ru, f2 ~ Tagged l2 v2) => UnionSymRec' 'True r1 f2 r2' ru Source # | Field f2 is already in r1, so it will be in the union of r1 with the rest of r2. To inject (HCons f2 r2) in that union, we should replace the field f2 |
labelLVPair :: Tagged l v -> Label l Source #
Label accessor
type family UnLabel (proxy :: k) (ls :: [*]) :: [k] Source #
remove the Label type constructor. The proxy
argument is
supplied to make it easier to fix the kind variable k
.
data ReadComponent Source #
Instances
(Read v, ShowLabel l, x ~ Tagged l v, ReadP x ~ y) => ApplyAB ReadComponent (Proxy x) y Source # | |
Defined in Data.HList.Record applyAB :: ReadComponent -> Proxy x -> y Source # |
type HMapTaggedFn l r = (HMapCxt HList TaggedFn l r, RecordValuesR r ~ l, RecordValues r) Source #
type HLensCxt x r s t a b = (HasField x (r s) a, HUpdateAtLabel r x b s t, HasField x (r t) b, HUpdateAtLabel r x a t s, SameLength s t, SameLabels s t) Source #
constraints needed to implement HLens
zip
use the more general HZip
class instead
class HZipRecord x y xy | x y -> xy, xy -> x y where Source #
Instances
HZipRecord ('[] :: [Type]) ('[] :: [Type]) ('[] :: [Type]) Source # | |
Defined in Data.HList.Record | |
HZipRecord as bs abss => HZipRecord (Tagged x a ': as) (Tagged x b ': bs) (Tagged x (a, b) ': abss) Source # | |
alternative implementation
hZipRecord2 :: forall {x :: [Type]} {y :: [Type]} {y :: [Type]}. (SameLabels x y, SameLabels x y, HAllTaggedLV x, HMapAux HList TaggedFn (RecordValuesR x) x, HZipList (RecordValuesR y) (RecordValuesR y) (RecordValuesR x), RecordValues x, RecordValues y, RecordValues y, SameLength' x y, SameLength' x y, SameLength' y x, SameLength' y x) => Record y -> Record y -> Record x Source #
hUnzipRecord2 :: forall {x :: [Type]} {y :: [Type]} {x :: [Type]}. (SameLabels x y, SameLabels x y, HAllTaggedLV x, HAllTaggedLV x, HZipList (RecordValuesR x) (RecordValuesR x) (RecordValuesR y), HMapAux HList TaggedFn (RecordValuesR x) x, HMapAux HList TaggedFn (RecordValuesR x) x, RecordValues x, RecordValues y, RecordValues x, SameLength' x y, SameLength' x y, SameLength' y x, SameLength' y x) => Record y -> (Record x, Record x) Source #