Copyright | 2009-2015 Edward Kmett |
---|---|
License | BSD3 |
Maintainer | Edward Kmett <ekmett@gmail.com> |
Stability | experimental |
Portability | portable |
Safe Haskell | Safe |
Language | Haskell98 |
Synopsis
- newtype Tagged (s :: k) b = Tagged {
- unTagged :: b
- retag :: forall {k1} {k2} (s :: k1) b (t :: k2). Tagged s b -> Tagged t b
- untag :: forall {k} (s :: k) b. Tagged s b -> b
- tagSelf :: a -> Tagged a a
- untagSelf :: Tagged a a -> a
- asTaggedTypeOf :: forall {k} s tagged (b :: k). s -> tagged s b -> s
- witness :: Tagged a b -> a -> b
- proxy :: forall {k} (s :: k) a proxy. Tagged s a -> proxy s -> a
- unproxy :: forall {k} (s :: k) a. (Proxy s -> a) -> Tagged s a
- tagWith :: forall {k} proxy (s :: k) a. proxy s -> a -> Tagged s a
- reproxy :: forall {k1} {k2} proxy (a :: k1) (b :: k2). proxy a -> Proxy b
Tagged values
newtype Tagged (s :: k) b Source #
A
value is a value Tagged
s bb
with an attached phantom type s
.
This can be used in place of the more traditional but less safe idiom of
passing in an undefined value with the type, because unlike an (s -> b)
,
a
can't try to use the argument Tagged
s bs
as a real value.
Moreover, you don't have to rely on the compiler to inline away the extra argument, because the newtype is "free"
Tagged
has kind k -> * -> *
if the compiler supports PolyKinds
, therefore
there is an extra k
showing in the instance haddocks that may cause confusion.
Instances
Generic1 (Tagged s :: Type -> Type) Source # | |||||
Defined in Data.Tagged
| |||||
Bifoldable (Tagged :: Type -> Type -> Type) Source # | |||||
Bifoldable1 (Tagged :: Type -> Type -> Type) Source # | |||||
Defined in Data.Tagged | |||||
Bifunctor (Tagged :: Type -> Type -> Type) Source # | |||||
Bitraversable (Tagged :: Type -> Type -> Type) Source # | |||||
Defined in Data.Tagged bitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> Tagged a b -> f (Tagged c d) # | |||||
Eq2 (Tagged :: Type -> Type -> Type) Source # | |||||
Ord2 (Tagged :: Type -> Type -> Type) Source # | |||||
Defined in Data.Tagged | |||||
Read2 (Tagged :: Type -> Type -> Type) Source # | |||||
Defined in Data.Tagged liftReadsPrec2 :: (Int -> ReadS a) -> ReadS [a] -> (Int -> ReadS b) -> ReadS [b] -> Int -> ReadS (Tagged a b) # liftReadList2 :: (Int -> ReadS a) -> ReadS [a] -> (Int -> ReadS b) -> ReadS [b] -> ReadS [Tagged a b] # liftReadPrec2 :: ReadPrec a -> ReadPrec [a] -> ReadPrec b -> ReadPrec [b] -> ReadPrec (Tagged a b) # liftReadListPrec2 :: ReadPrec a -> ReadPrec [a] -> ReadPrec b -> ReadPrec [b] -> ReadPrec [Tagged a b] # | |||||
Show2 (Tagged :: Type -> Type -> Type) Source # | |||||
Foldable (Tagged s) Source # | |||||
Defined in Data.Tagged fold :: Monoid m => Tagged s m -> m # foldMap :: Monoid m => (a -> m) -> Tagged s a -> m # foldMap' :: Monoid m => (a -> m) -> Tagged s a -> m # foldr :: (a -> b -> b) -> b -> Tagged s a -> b # foldr' :: (a -> b -> b) -> b -> Tagged s a -> b # foldl :: (b -> a -> b) -> b -> Tagged s a -> b # foldl' :: (b -> a -> b) -> b -> Tagged s a -> b # foldr1 :: (a -> a -> a) -> Tagged s a -> a # foldl1 :: (a -> a -> a) -> Tagged s a -> a # elem :: Eq a => a -> Tagged s a -> Bool # maximum :: Ord a => Tagged s a -> a # minimum :: Ord a => Tagged s a -> a # | |||||
Foldable1 (Tagged a) Source # | |||||
Defined in Data.Tagged fold1 :: Semigroup m => Tagged a m -> m # foldMap1 :: Semigroup m => (a0 -> m) -> Tagged a a0 -> m # foldMap1' :: Semigroup m => (a0 -> m) -> Tagged a a0 -> m # toNonEmpty :: Tagged a a0 -> NonEmpty a0 # maximum :: Ord a0 => Tagged a a0 -> a0 # minimum :: Ord a0 => Tagged a a0 -> a0 # foldrMap1 :: (a0 -> b) -> (a0 -> b -> b) -> Tagged a a0 -> b # foldlMap1' :: (a0 -> b) -> (b -> a0 -> b) -> Tagged a a0 -> b # foldlMap1 :: (a0 -> b) -> (b -> a0 -> b) -> Tagged a a0 -> b # foldrMap1' :: (a0 -> b) -> (a0 -> b -> b) -> Tagged a a0 -> b # | |||||
Eq1 (Tagged s) Source # | |||||
Ord1 (Tagged s) Source # | |||||
Defined in Data.Tagged | |||||
Read1 (Tagged s) Source # | |||||
Defined in Data.Tagged | |||||
Show1 (Tagged s) Source # | |||||
Traversable (Tagged s) Source # | |||||
Applicative (Tagged s) Source # | |||||
Functor (Tagged s) Source # | |||||
Monad (Tagged s) Source # | |||||
(Data s, Data b) => Data (Tagged s b) Source # | |||||
Defined in Data.Tagged gfoldl :: (forall d b0. Data d => c (d -> b0) -> d -> c b0) -> (forall g. g -> c g) -> Tagged s b -> c (Tagged s b) # gunfold :: (forall b0 r. Data b0 => c (b0 -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Tagged s b) # toConstr :: Tagged s b -> Constr # dataTypeOf :: Tagged s b -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Tagged s b)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Tagged s b)) # gmapT :: (forall b0. Data b0 => b0 -> b0) -> Tagged s b -> Tagged s b # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Tagged s b -> r # gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Tagged s b -> r # gmapQ :: (forall d. Data d => d -> u) -> Tagged s b -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Tagged s b -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Tagged s b -> m (Tagged s b) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Tagged s b -> m (Tagged s b) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Tagged s b -> m (Tagged s b) # | |||||
IsString a => IsString (Tagged s a) Source # | |||||
Defined in Data.Tagged fromString :: String -> Tagged s a # | |||||
Storable a => Storable (Tagged s a) Source # | |||||
Defined in Data.Tagged | |||||
(Semigroup a, Monoid a) => Monoid (Tagged s a) Source # | |||||
Semigroup a => Semigroup (Tagged s a) Source # | |||||
Bits a => Bits (Tagged s a) Source # | |||||
Defined in Data.Tagged (.&.) :: Tagged s a -> Tagged s a -> Tagged s a # (.|.) :: Tagged s a -> Tagged s a -> Tagged s a # xor :: Tagged s a -> Tagged s a -> Tagged s a # complement :: Tagged s a -> Tagged s a # shift :: Tagged s a -> Int -> Tagged s a # rotate :: Tagged s a -> Int -> Tagged s a # setBit :: Tagged s a -> Int -> Tagged s a # clearBit :: Tagged s a -> Int -> Tagged s a # complementBit :: Tagged s a -> Int -> Tagged s a # testBit :: Tagged s a -> Int -> Bool # bitSizeMaybe :: Tagged s a -> Maybe Int # bitSize :: Tagged s a -> Int # isSigned :: Tagged s a -> Bool # shiftL :: Tagged s a -> Int -> Tagged s a # unsafeShiftL :: Tagged s a -> Int -> Tagged s a # shiftR :: Tagged s a -> Int -> Tagged s a # unsafeShiftR :: Tagged s a -> Int -> Tagged s a # rotateL :: Tagged s a -> Int -> Tagged s a # | |||||
FiniteBits a => FiniteBits (Tagged s a) Source # | |||||
Defined in Data.Tagged finiteBitSize :: Tagged s a -> Int # countLeadingZeros :: Tagged s a -> Int # countTrailingZeros :: Tagged s a -> Int # | |||||
Bounded b => Bounded (Tagged s b) Source # | |||||
Enum a => Enum (Tagged s a) Source # | |||||
Defined in Data.Tagged succ :: Tagged s a -> Tagged s a # pred :: Tagged s a -> Tagged s a # fromEnum :: Tagged s a -> Int # enumFrom :: Tagged s a -> [Tagged s a] # enumFromThen :: Tagged s a -> Tagged s a -> [Tagged s a] # enumFromTo :: Tagged s a -> Tagged s a -> [Tagged s a] # enumFromThenTo :: Tagged s a -> Tagged s a -> Tagged s a -> [Tagged s a] # | |||||
Floating a => Floating (Tagged s a) Source # | |||||
Defined in Data.Tagged exp :: Tagged s a -> Tagged s a # log :: Tagged s a -> Tagged s a # sqrt :: Tagged s a -> Tagged s a # (**) :: Tagged s a -> Tagged s a -> Tagged s a # logBase :: Tagged s a -> Tagged s a -> Tagged s a # sin :: Tagged s a -> Tagged s a # cos :: Tagged s a -> Tagged s a # tan :: Tagged s a -> Tagged s a # asin :: Tagged s a -> Tagged s a # acos :: Tagged s a -> Tagged s a # atan :: Tagged s a -> Tagged s a # sinh :: Tagged s a -> Tagged s a # cosh :: Tagged s a -> Tagged s a # tanh :: Tagged s a -> Tagged s a # asinh :: Tagged s a -> Tagged s a # acosh :: Tagged s a -> Tagged s a # atanh :: Tagged s a -> Tagged s a # log1p :: Tagged s a -> Tagged s a # expm1 :: Tagged s a -> Tagged s a # | |||||
RealFloat a => RealFloat (Tagged s a) Source # | |||||
Defined in Data.Tagged floatRadix :: Tagged s a -> Integer # floatDigits :: Tagged s a -> Int # floatRange :: Tagged s a -> (Int, Int) # decodeFloat :: Tagged s a -> (Integer, Int) # encodeFloat :: Integer -> Int -> Tagged s a # exponent :: Tagged s a -> Int # significand :: Tagged s a -> Tagged s a # scaleFloat :: Int -> Tagged s a -> Tagged s a # isInfinite :: Tagged s a -> Bool # isDenormalized :: Tagged s a -> Bool # isNegativeZero :: Tagged s a -> Bool # | |||||
Generic (Tagged s b) Source # | |||||
Defined in Data.Tagged
| |||||
Ix b => Ix (Tagged s b) Source # | |||||
Defined in Data.Tagged range :: (Tagged s b, Tagged s b) -> [Tagged s b] # index :: (Tagged s b, Tagged s b) -> Tagged s b -> Int # unsafeIndex :: (Tagged s b, Tagged s b) -> Tagged s b -> Int # inRange :: (Tagged s b, Tagged s b) -> Tagged s b -> Bool # rangeSize :: (Tagged s b, Tagged s b) -> Int # unsafeRangeSize :: (Tagged s b, Tagged s b) -> Int # | |||||
Num a => Num (Tagged s a) Source # | |||||
Defined in Data.Tagged | |||||
Read b => Read (Tagged s b) Source # | |||||
Fractional a => Fractional (Tagged s a) Source # | |||||
Integral a => Integral (Tagged s a) Source # | |||||
Defined in Data.Tagged quot :: Tagged s a -> Tagged s a -> Tagged s a # rem :: Tagged s a -> Tagged s a -> Tagged s a # div :: Tagged s a -> Tagged s a -> Tagged s a # mod :: Tagged s a -> Tagged s a -> Tagged s a # quotRem :: Tagged s a -> Tagged s a -> (Tagged s a, Tagged s a) # divMod :: Tagged s a -> Tagged s a -> (Tagged s a, Tagged s a) # | |||||
Real a => Real (Tagged s a) Source # | |||||
Defined in Data.Tagged toRational :: Tagged s a -> Rational # | |||||
RealFrac a => RealFrac (Tagged s a) Source # | |||||
Show b => Show (Tagged s b) Source # | |||||
NFData b => NFData (Tagged s b) Source # | |||||
Defined in Data.Tagged | |||||
Eq b => Eq (Tagged s b) Source # | |||||
Ord b => Ord (Tagged s b) Source # | |||||
type Rep1 (Tagged s :: Type -> Type) Source # | |||||
Defined in Data.Tagged | |||||
type Rep (Tagged s b) Source # | |||||
Defined in Data.Tagged |
asTaggedTypeOf :: forall {k} s tagged (b :: k). s -> tagged s b -> s Source #
asTaggedTypeOf
is a type-restricted version of const
. It is usually used as an infix operator, and its typing forces its first argument (which is usually overloaded) to have the same type as the tag of the second.
Conversion
tagWith :: forall {k} proxy (s :: k) a. proxy s -> a -> Tagged s a Source #
Another way to convert a proxy to a tag.