úÎ|±     generalized newtype deriving experimentalEdward Kmett <ekmett@gmail.com>A  s b value is a value b with an attached phantom type s. J 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  s b can't try to use the argument s as a real value. Moreover, you don'8t have to rely on the compiler to inline away the extra " argument, because the newtype is free =Some times you need to change the tag you have lying around. N Idiomatic usage is to make a new combinator for the relationship between the A tags that you want to enforce, and define that combinator using .  data Succ n . retagSucc :: Tagged n a -> Tagged (Succ n) a  retagSucc = retag  Alias for  Tag a value with its own type. ! is a type-restricted version of ¢. 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. ! is a type-restricted version of . generalized newtype deriving experimentalEdward Kmett <ekmett@gmail.com> =Some times you need to change the tag you have lying around. C Idiomatic usage is to make a new combinator for the relationship = between the tags that you want to enforce, and define that  combinator using .  data Succ n * reproxySucc :: Proxy n -> Proxy (Succ n)  reproxySucc = reproxy Convert from a % representation to a representation  based on a  . )Convert from a representation based on a   to a   representation.  ! is a type-restricted version of . K It is usually used as an infix operator, and its typing forces its first J argument (which is usually overloaded) to have the same type as the tag  of the second.           tagged-0.2 Data.Tagged Data.ProxyTaggedunTaggedretaguntagtagSelfasTaggedTypeOf untagSelfProxyreproxyproxyunproxy asProxyTypeOfbaseGHC.Baseconst