Safe Haskell | None |
---|---|
Language | Haskell2010 |
Darcs.Patch.Witnesses.Sealed
Synopsis
- data Sealed (a :: Type -> Type) where
- seal :: a wX -> Sealed a
- unseal :: (forall wX. a wX -> b) -> Sealed a -> b
- mapSeal :: (forall wX. a wX -> b wX) -> Sealed a -> Sealed b
- data Sealed2 (a :: Type -> Type -> Type) where
- seal2 :: a wX wY -> Sealed2 a
- unseal2 :: (forall wX wY. a wX wY -> b) -> Sealed2 a -> b
- mapSeal2 :: (forall wX wY. a wX wY -> b wX wY) -> Sealed2 a -> Sealed2 b
- data FlippedSeal (a :: Type -> Type -> Type) wY where
- FlippedSeal :: forall (a :: Type -> Type -> Type) wX wY. !(a wX wY) -> FlippedSeal a wY
- flipSeal :: a wX wY -> FlippedSeal a wY
- unsealFlipped :: (forall wX wY. a wX wY -> b) -> FlippedSeal a wZ -> b
- mapFlipped :: (forall wX. a wX wY -> b wX wZ) -> FlippedSeal a wY -> FlippedSeal b wZ
- data Dup (p :: Type -> Type) wX wY where
- class Gap (w :: (Type -> Type -> Type) -> Type) where
- data FreeLeft (p :: Type -> Type -> Type)
- unFreeLeft :: forall (p :: Type -> Type -> Type) wX. FreeLeft p -> Sealed (p wX)
- data FreeRight (p :: Type -> Type -> Type)
- unFreeRight :: forall (p :: Type -> Type -> Type) wX. FreeRight p -> FlippedSeal p wX
Documentation
data Sealed (a :: Type -> Type) where #
A Sealed
type is a way of hide an existentially quantified type parameter,
in this case wX, inside the type. Note that the only thing we can currently
recover about the existentially quantified type wX is that it exists.
data Sealed2 (a :: Type -> Type -> Type) where #
The same as Sealed
but for two parameters (wX and wY).
data FlippedSeal (a :: Type -> Type -> Type) wY where #
Constructors
FlippedSeal :: forall (a :: Type -> Type -> Type) wX wY. !(a wX wY) -> FlippedSeal a wY |
flipSeal :: a wX wY -> FlippedSeal a wY #
unsealFlipped :: (forall wX wY. a wX wY -> b) -> FlippedSeal a wZ -> b #
mapFlipped :: (forall wX. a wX wY -> b wX wZ) -> FlippedSeal a wY -> FlippedSeal b wZ #
data Dup (p :: Type -> Type) wX wY where #
Duplicate a single witness. This is for situations where a patch-like type is expected, i.e. a type with two witnesses, but we have only a type with one witness. Naturally, any concrete value must have both witnesses agreeing.
class Gap (w :: (Type -> Type -> Type) -> Type) where #
Methods
emptyGap :: (forall wX. p wX wX) -> w p #
An empty Gap
, e.g. NilFL
or NilRL
freeGap :: (forall wX wY. p wX wY) -> w p #
A Gap
constructed from a completely polymorphic value, for example the constructors
for primitive patches
joinGap :: (forall wX wY wZ. p wX wY -> q wY wZ -> r wX wZ) -> w p -> w q -> w r #
Compose two Gap
values together in series, e.g. 'joinGap (+>+)' or 'joinGap (:>:)'
data FreeLeft (p :: Type -> Type -> Type) #
FreeLeft
p is forall x . exists y . p x y
In other words the caller is free to specify the left witness,
and then the right witness is an existential.
Note that the order of the type constructors is important for ensuring
that y
is dependent on the x
that is supplied.
This is why Stepped
is needed, rather than writing the more obvious
Sealed
(Poly
p) which would notionally have the same quantification
of the type witnesses.
unFreeLeft :: forall (p :: Type -> Type -> Type) wX. FreeLeft p -> Sealed (p wX) #
Unwrap a FreeLeft
value
data FreeRight (p :: Type -> Type -> Type) #
FreeRight
p is forall y . exists x . p x y
In other words the caller is free to specify the right witness,
and then the left witness is an existential.
Note that the order of the type constructors is important for ensuring
that x
is dependent on the y
that is supplied.
unFreeRight :: forall (p :: Type -> Type -> Type) wX. FreeRight p -> FlippedSeal p wX #
Unwrap a FreeRight
value