-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Validity typeclass -- -- For more info, see the readme. -- -- Note: There are companion instance packages for this library: -- -- @package validity @version 0.3.2.0 -- | Validity is used to specify additional invariants upon values -- that are not enforced by the type system. -- -- Let's take an example. Suppose we were to implement a type -- Prime that represents prime integers. -- -- If you were to completely enforce the invariant that the represented -- number is a prime, then we could use Natural and only store the -- index of the given prime in the infinite sequence of prime numbers. -- This is very safe but also very expensive if we ever want to use the -- number, because we would have to calculcate all the prime numbers -- until that index. -- -- Instead we choose to implement Prime by a newtype Prime = -- Prime Int. Now we have to maintain the invariant that the -- Int that we use to represent the prime is in fact positive -- and a prime. -- -- The Validity typeclass allows us to specify this invariant -- (and enables testing via the genvalidity libraries: -- https://hackage.haskell.org/package/genvalidity ): -- --
--   instance Validity Prime where
--       isValid (Prime n) = isPrime n
--   
-- -- If certain typeclass invariants exist, you can make these explicit in -- the validity instance as well. For example, 'Fixed a' is only valid if -- a has an HasResolution instance, so the correct -- validity instance is HasResolution a => Validity (Fixed -- a). module Data.Validity -- | A class of types that have additional invariants defined upon them -- that aren't enforced by the type system class Validity a where isValid = gIsValid . from isValid :: Validity a => a -> Bool isValid :: (Validity a, Generic a, GValidity (Rep a)) => a -> Bool isInvalid :: Validity a => a -> Bool -- | Construct a valid element from an unchecked element constructValid :: Validity a => a -> Maybe a -- | Construct a valid element from an unchecked element, throwing -- error on invalid elements. constructValidUnsafe :: (Show a, Validity a) => a -> a instance (Data.Validity.Validity a, Data.Validity.Validity b) => Data.Validity.Validity (a, b) instance (Data.Validity.Validity a, Data.Validity.Validity b) => Data.Validity.Validity (Data.Either.Either a b) instance (Data.Validity.Validity a, Data.Validity.Validity b, Data.Validity.Validity c) => Data.Validity.Validity (a, b, c) instance Data.Validity.Validity a => Data.Validity.Validity [a] instance Data.Validity.Validity a => Data.Validity.Validity (GHC.Base.Maybe a) instance Data.Validity.Validity () instance Data.Validity.Validity GHC.Types.Bool instance Data.Validity.Validity GHC.Types.Ordering instance Data.Validity.Validity GHC.Types.Char instance Data.Validity.Validity GHC.Types.Int instance Data.Validity.Validity GHC.Types.Word instance Data.Validity.Validity GHC.Types.Float instance Data.Validity.Validity GHC.Types.Double instance Data.Validity.Validity GHC.Integer.Type.Integer instance Data.Validity.Validity GHC.Natural.Natural instance Data.Validity.Validity GHC.Real.Rational instance Data.Fixed.HasResolution a => Data.Validity.Validity (Data.Fixed.Fixed a) instance Data.Validity.GValidity GHC.Generics.U1 instance (Data.Validity.GValidity a, Data.Validity.GValidity b) => Data.Validity.GValidity (a GHC.Generics.:*: b) instance (Data.Validity.GValidity a, Data.Validity.GValidity b) => Data.Validity.GValidity (a GHC.Generics.:+: b) instance Data.Validity.GValidity a => Data.Validity.GValidity (GHC.Generics.M1 i c a) instance Data.Validity.Validity a => Data.Validity.GValidity (GHC.Generics.K1 i a) -- | Relative validity module Data.RelativeValidity -- | A class of types that have additional invariants defined upon them -- that aren't enforced by the type system -- -- If there is a Validity a instance as well, then a -- isValidFor b should imply isValid a for any -- b. -- -- If there is a Validity b instance as well, then a -- isValidFor b should imply isValid b for any -- a. class RelativeValidity a b isValidFor :: RelativeValidity a b => a -> b -> Bool isInvalidFor :: RelativeValidity a b => a -> b -> Bool