- data Sealed a where
- seal :: a -> Sealed a
- unseal :: (a -> b) -> Sealed a -> b
- mapSeal :: (a -> b) -> Sealed a -> Sealed b
- unsafeUnseal :: Sealed a -> a
- unsafeUnsealFlipped :: FlippedSeal a -> a
- unsafeUnseal2 :: Sealed2 a -> a
- data Sealed2 a where
- seal2 :: a -> Sealed2 a
- unseal2 :: (a -> b) -> Sealed2 a -> b
- mapSeal2 :: (a -> b) -> Sealed2 a -> Sealed2 b
- data FlippedSeal a where
- FlippedSeal :: !a -> FlippedSeal a
- flipSeal :: a -> FlippedSeal a
- unsealFlipped :: (a -> b) -> FlippedSeal a -> b
- mapFlipped :: (a -> b) -> FlippedSeal a -> FlippedSeal b
- unsealM :: Monad m => m (Sealed a) -> (a -> m b) -> m b
- liftSM :: Monad m => (a -> b) -> m (Sealed a) -> m b
- class Gap w where
- data FreeLeft p
- unFreeLeft :: FreeLeft p -> Sealed p
- data FreeRight p
- unFreeRight :: FreeRight p -> FlippedSeal p
Documentation
unsafeUnseal :: Sealed a -> aSource
unsafeUnsealFlipped :: FlippedSeal a -> aSource
unsafeUnseal2 :: Sealed2 a -> aSource
data FlippedSeal a whereSource
FlippedSeal :: !a -> FlippedSeal a |
flipSeal :: a -> FlippedSeal aSource
unsealFlipped :: (a -> b) -> FlippedSeal a -> bSource
mapFlipped :: (a -> b) -> FlippedSeal a -> FlippedSeal bSource
'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 :: FreeLeft p -> Sealed pSource
Unwrap a FreeLeft
value
'FreeLeft 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 :: FreeRight p -> FlippedSeal pSource
Unwrap a FreeRight
value