| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Test.QuickCheck.Classes
Description
Synopsis
- lawsCheck :: Laws -> IO ()
- lawsCheckMany :: [(String, [Laws])] -> IO ()
- lawsCheckOne :: Proxy a -> [Proxy a -> Laws] -> IO ()
- bitsLaws :: (FiniteBits a, Arbitrary a, Show a) => Proxy a -> Laws
- eqLaws :: (Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- substitutiveEqLaws :: (Eq a, Arbitrary a, CoArbitrary a, Function a, Show a) => Proxy a -> Laws
- numLaws :: (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- integralLaws :: (Integral a, Arbitrary a, Show a) => Proxy a -> Laws
- ixLaws :: (Ix a, Arbitrary a, Show a) => Proxy a -> Laws
- isListLaws :: (IsList a, Show a, Show (Item a), Arbitrary a, Arbitrary (Item a), Eq a) => Proxy a -> Laws
- jsonLaws :: (ToJSON a, FromJSON a, Show a, Arbitrary a, Eq a) => Proxy a -> Laws
- monoidLaws :: (Monoid a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- commutativeMonoidLaws :: (Monoid a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- semigroupMonoidLaws :: (Semigroup a, Monoid a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- ordLaws :: (Ord a, Arbitrary a, Show a) => Proxy a -> Laws
- enumLaws :: (Enum a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- boundedEnumLaws :: (Enum a, Bounded a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- primLaws :: (Prim a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- semigroupLaws :: (Semigroup a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- commutativeSemigroupLaws :: (Semigroup a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- exponentialSemigroupLaws :: (Semigroup a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- idempotentSemigroupLaws :: (Semigroup a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- rectangularBandSemigroupLaws :: (Semigroup a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- semiringLaws :: (Semiring a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- ringLaws :: (Ring a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- gcdDomainLaws :: (Eq a, GcdDomain a, Arbitrary a, Show a) => Proxy a -> Laws
- euclideanLaws :: (Eq a, Euclidean a, Arbitrary a, Show a) => Proxy a -> Laws
- showLaws :: (Show a, Arbitrary a) => Proxy a -> Laws
- showReadLaws :: (Show a, Read a, Eq a, Arbitrary a) => Proxy a -> Laws
- storableLaws :: (Storable a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
- genericLaws :: (Generic a, Eq a, Arbitrary a, Show a, Show (Rep a ()), Arbitrary (Rep a ()), Eq (Rep a ())) => Proxy a -> Laws
- generic1Laws :: forall (f :: Type -> Type) proxy. (Generic1 f, Eq1 f, Arbitrary1 f, Show1 f, Eq1 (Rep1 f), Show1 (Rep1 f), Arbitrary1 (Rep1 f)) => proxy f -> Laws
- alternativeLaws :: forall (f :: Type -> Type) proxy. (Alternative f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws
- altLaws :: forall proxy f. (Alt f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws
- applyLaws :: (Apply f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws
- applicativeLaws :: forall (f :: Type -> Type) proxy. (Applicative f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws
- contravariantLaws :: forall (f :: Type -> Type) proxy. (Contravariant f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws
- foldableLaws :: forall proxy (f :: Type -> Type). (Foldable f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws
- functorLaws :: forall (f :: Type -> Type) proxy. (Functor f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws
- monadLaws :: forall (f :: Type -> Type) proxy. (Monad f, Applicative f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws
- monadPlusLaws :: forall (f :: Type -> Type) proxy. (MonadPlus f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws
- monadZipLaws :: forall (f :: Type -> Type) proxy. (MonadZip f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws
- plusLaws :: forall proxy f. (Plus f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws
- extendedPlusLaws :: forall proxy f. (Plus f, Alternative f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws
- traversableLaws :: forall (f :: Type -> Type) proxy. (Traversable f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws
- bifoldableLaws :: forall proxy (f :: Type -> Type -> Type). (Bifoldable f, forall a b. (Eq a, Eq b) => Eq (f a b), forall a b. (Show a, Show b) => Show (f a b), forall a b. (Arbitrary a, Arbitrary b) => Arbitrary (f a b)) => proxy f -> Laws
- bifunctorLaws :: forall proxy (f :: Type -> Type -> Type). (Bifunctor f, forall a b. (Eq a, Eq b) => Eq (f a b), forall a b. (Show a, Show b) => Show (f a b), forall a b. (Arbitrary a, Arbitrary b) => Arbitrary (f a b)) => proxy f -> Laws
- bitraversableLaws :: forall proxy (f :: Type -> Type -> Type). (Bitraversable f, forall a b. (Eq a, Eq b) => Eq (f a b), forall a b. (Show a, Show b) => Show (f a b), forall a b. (Arbitrary a, Arbitrary b) => Arbitrary (f a b)) => proxy f -> Laws
- categoryLaws :: forall proxy (c :: Type -> Type -> Type). (Category c, forall a b. (Eq a, Eq b) => Eq (c a b), forall a b. (Show a, Show b) => Show (c a b), forall a b. (Arbitrary a, Arbitrary b) => Arbitrary (c a b)) => proxy c -> Laws
- commutativeCategoryLaws :: forall proxy (c :: Type -> Type -> Type). (Category c, forall a b. (Eq a, Eq b) => Eq (c a b), forall a b. (Show a, Show b) => Show (c a b), forall a b. (Arbitrary a, Arbitrary b) => Arbitrary (c a b)) => proxy c -> Laws
- semigroupoidLaws :: forall proxy s. (Semigroupoid s, forall a b. (Eq a, Eq b) => Eq (s a b), forall a b. (Show a, Show b) => Show (s a b), forall a b. (Arbitrary a, Arbitrary b) => Arbitrary (s a b)) => proxy s -> Laws
- commutativeSemigroupoidLaws :: forall proxy s. (Semigroupoid s, forall a b. (Eq a, Eq b) => Eq (s a b), forall a b. (Show a, Show b) => Show (s a b), forall a b. (Arbitrary a, Arbitrary b) => Arbitrary (s a b)) => proxy s -> Laws
- muvectorLaws :: (Eq a, Unbox a, Arbitrary a, Show a) => Proxy a -> Laws
- data Laws = Laws {
- lawsTypeclass :: String
- lawsProperties :: [(String, Property)]
- data Proxy1 (f :: Type -> Type) = Proxy1
- data Proxy2 (f :: Type -> Type -> Type) = Proxy2
Running
A convenience function for testing properties in GHCi. For example, at GHCi:
>>>lawsCheck (monoidLaws (Proxy :: Proxy Ordering))Monoid: Associative +++ OK, passed 100 tests. Monoid: Left Identity +++ OK, passed 100 tests. Monoid: Right Identity +++ OK, passed 100 tests.
Assuming that the Arbitrary instance for Ordering is good, we now
have confidence that the Monoid instance for Ordering satisfies
the monoid laws.
A convenience function for checking multiple typeclass instances of multiple types. Consider the following Haskell source file:
import Data.Proxy (Proxy(..)) import Data.Map (Map) import Data.Set (Set) -- AProxyforSetInt. setInt :: Proxy (Set Int) setInt = Proxy -- AProxyforMapIntInt. mapInt :: Proxy (Map Int Int) mapInt = Proxy myLaws :: Proxy a -> [Laws] myLaws p = [eqLaws p, monoidLaws p] namedTests :: [(String, [Laws])] namedTests = [ ("Set Int", myLaws setInt) , ("Map Int Int", myLaws mapInt) ]
Now, in GHCi:
>>>lawsCheckMany namedTests
Testing properties for common typeclasses ------------- -- Set Int -- ------------- Eq: Transitive +++ OK, passed 100 tests. Eq: Symmetric +++ OK, passed 100 tests. Eq: Reflexive +++ OK, passed 100 tests. Monoid: Associative +++ OK, passed 100 tests. Monoid: Left Identity +++ OK, passed 100 tests. Monoid: Right Identity +++ OK, passed 100 tests. Monoid: Concatenation +++ OK, passed 100 tests. ----------------- -- Map Int Int -- ----------------- Eq: Transitive +++ OK, passed 100 tests. Eq: Symmetric +++ OK, passed 100 tests. Eq: Reflexive +++ OK, passed 100 tests. Monoid: Associative +++ OK, passed 100 tests. Monoid: Left Identity +++ OK, passed 100 tests. Monoid: Right Identity +++ OK, passed 100 tests. Monoid: Concatenation +++ OK, passed 100 tests.
In the case of a failing test, the program terminates with exit code 1.
lawsCheckOne :: Proxy a -> [Proxy a -> Laws] -> IO () #
A convenience function that allows one to check many typeclass instances of the same type.
>>>specialisedLawsCheckMany (Proxy :: Proxy Word) [jsonLaws, showReadLaws]ToJSON/FromJSON: Encoding Equals Value +++ OK, passed 100 tests. ToJSON/FromJSON: Partial Isomorphism +++ OK, passed 100 tests. Show/Read: Partial Isomorphism +++ OK, passed 100 tests.
Properties
Ground types
bitsLaws :: (FiniteBits a, Arbitrary a, Show a) => Proxy a -> Laws #
Tests the following properties:
- Conjunction Idempotence
n .&. n ≡ n- Disjunction Idempotence
n .|. n ≡ n- Double Complement
complement (complement n) ≡ n- Set Bit
setBit n i ≡ n .|. bit i- Clear Bit
clearBit n i ≡ n .&. complement (bit i)- Complement Bit
complementBit n i ≡ xor n (bit i)- Clear Zero
clearBit zeroBits i ≡ zeroBits- Set Zero
setBit zeroBits i ≡ bit i- Test Zero
testBit zeroBits i ≡ False- Pop Zero
popCount zeroBits ≡ 0- Right Rotation
no sign extension → (rotateR n i ≡ (shiftR n i) .|. (shiftL n (finiteBitSize ⊥ - i)))- Left Rotation
no sign extension → (rotateL n i ≡ (shiftL n i) .|. (shiftR n (finiteBitSize ⊥ - i)))- Count Leading Zeros of Zero
countLeadingZeros zeroBits ≡ finiteBitSize ⊥- Count Trailing Zeros of Zero
countTrailingZeros zeroBits ≡ finiteBitSize ⊥
All of the useful instances of the Bits typeclass
also have FiniteBits instances, so these property
tests actually require that instance as well.
Note: This property test is only available when
using base-4.7 or newer.
eqLaws :: (Eq a, Arbitrary a, Show a) => Proxy a -> Laws #
Tests the following properties:
- Transitive
a==b ∧ b==c ⇒ a==c- Symmetric
a==b ⇒ b==a- Reflexive
a==a- Negation
x/=y==not(x==y)
Some of these properties involve implication. In the case that the left hand side of the implication arrow does not hold, we do not retry. Consequently, these properties only end up being useful when the data type has a small number of inhabitants.
substitutiveEqLaws :: (Eq a, Arbitrary a, CoArbitrary a, Function a, Show a) => Proxy a -> Laws #
numLaws :: (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws #
Tests the following properties:
- Additive Commutativity
a + b ≡ b + a- Additive Left Identity
0 + a ≡ a- Additive Right Identity
a + 0 ≡ a- Multiplicative Associativity
a * (b * c) ≡ (a * b) * c- Multiplicative Left Identity
1 * a ≡ a- Multiplicative Right Identity
a * 1 ≡ a- Multiplication Left Distributes Over Addition
a * (b + c) ≡ (a * b) + (a * c)- Multiplication Right Distributes Over Addition
(a + b) * c ≡ (a * c) + (b * c)- Multiplicative Left Annihilation
0 * a ≡ 0- Multiplicative Right Annihilation
a * 0 ≡ 0- Additive Inverse
negatea+a ≡ 0- Subtraction
a+negateb ≡ a-b- Abs Is Idempotent
- @
abs(absa) ≡absa - Signum Is Idempotent
- @
signum(signuma) ≡signuma - Product Of Abs And Signum Is Id
absa *signuma ≡ a
integralLaws :: (Integral a, Arbitrary a, Show a) => Proxy a -> Laws #
Tests the following properties:
- Quotient Remainder
(quot x y) * y + (rem x y) ≡ x- Division Modulus
(div x y) * y + (mod x y) ≡ x- Integer Roundtrip
fromInteger (toInteger x) ≡ x- QuotRem is (Quot, Rem)
quotRem x y ≡ (quot x y, rem x y)- DivMod is (Div, Mod)
divMod x y ≡ (div x y, mod x y)
isListLaws :: (IsList a, Show a, Show (Item a), Arbitrary a, Arbitrary (Item a), Eq a) => Proxy a -> Laws #
Tests the following properties:
- Partial Isomorphism
fromList . toList ≡ id- Length Preservation
fromList xs ≡ fromListN (length xs) xs
Note: This property test is only available when
using base-4.7 or newer.
jsonLaws :: (ToJSON a, FromJSON a, Show a, Arbitrary a, Eq a) => Proxy a -> Laws Source #
Tests the following properties:
- Partial Isomorphism
decode . encode ≡ Just- Encoding Equals Value
decode . encode ≡ Just . toJSON
Note that in the second property, the type of decode is ByteString -> Value,
not ByteString -> a
monoidLaws :: (Monoid a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws #
Tests the following properties:
- Associative
mappend a (mappend b c) ≡ mappend (mappend a b) c- Left Identity
mappend mempty a ≡ a- Right Identity
mappend a mempty ≡ a- Concatenation
mconcat as ≡ foldr mappend mempty as
commutativeMonoidLaws :: (Monoid a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws #
Tests the following properties:
- Commutative
mappend a b ≡ mappend b a
Note that this does not test associativity or identity. Make sure to use
monoidLaws in addition to this set of laws.
ordLaws :: (Ord a, Arbitrary a, Show a) => Proxy a -> Laws #
Tests the following properties:
- Antisymmetry
a ≤ b ∧ b ≤ a ⇒ a = b- Transitivity
a ≤ b ∧ b ≤ c ⇒ a ≤ c- Totality
a ≤ b ∨ a > b
enumLaws :: (Enum a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws #
Tests the following properties:
This only works for Enum types that are not bounded, meaning
that succ and pred must be total. This means that these property
tests work correctly for types like Integer but not for Int.
Sadly, there is not a good way to test fromEnum and toEnum,
since many types that have reasonable implementations for succ
and pred have more inhabitants than Int does.
primLaws :: (Prim a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws Source #
Test that a Prim instance obey the several laws.
commutativeSemigroupLaws :: (Semigroup a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws #
Tests the following properties:
Note that this does not test associativity. Make sure to use
semigroupLaws in addition to this set of laws.
idempotentSemigroupLaws :: (Semigroup a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws #
Tests the following properties:
- Idempotent
a<>a ≡ a
Note that this does not test associativity. Make sure to use
semigroupLaws in addition to this set of laws. In literature,
this class of semigroup is known as a band.
rectangularBandSemigroupLaws :: (Semigroup a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws #
Tests the following properties:
Note that this does not test associativity. Make sure to use
semigroupLaws in addition to this set of laws.
semiringLaws :: (Semiring a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws Source #
Tests the following properties:
- Additive Commutativity
a + b ≡ b + a- Additive Left Identity
0 + a ≡ a- Additive Right Identity
a + 0 ≡ a- Multiplicative Associativity
a * (b * c) ≡ (a * b) * c- Multiplicative Left Identity
1 * a ≡ a- Multiplicative Right Identity
a * 1 ≡ a- Multiplication Left Distributes Over Addition
a * (b + c) ≡ (a * b) + (a * c)- Multiplication Right Distributes Over Addition
(a + b) * c ≡ (a * c) + (b * c)- Multiplicative Left Annihilation
0 * a ≡ 0- Multiplicative Right Annihilation
a * 0 ≡ 0
Also tests that fromNatural is a homomorphism of semirings:
- FromNatural Maps Zero
fromNatural0 =zero- FromNatural Maps One
fromNatural1 =one- FromNatural Maps Plus
fromNatural(a+b) =fromNaturala+fromNaturalb- FromNatural Maps Times
fromNatural(a*b) =fromNaturala*fromNaturalb
ringLaws :: (Ring a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws Source #
Tests the following properties:
Note that this does not test any of the laws tested by semiringLaws.
gcdDomainLaws :: (Eq a, GcdDomain a, Arbitrary a, Show a) => Proxy a -> Laws Source #
Test that a GcdDomain instance obey several laws.
Check that divide is an inverse of times:
y /= 0 => (x * y) `divide` y == Just x,y /= 0, x `divide` y == Just z => x == z * y.
Check that gcd is a common divisor and is a multiple of any common divisor:
x /= 0, y /= 0 => isJust (x `divide` gcd x y) && isJust (y `divide` gcd x y),z /= 0 => isJust (gcd (x * z) (y * z) `divide` z).
Check that lcm is a common multiple and is a factor of any common multiple:
x /= 0, y /= 0 => isJust (lcm x y `divide` x) && isJust (lcm x y `divide` y),x /= 0, y /= 0, isJust (z `divide` x), isJust (z `divide` y) => isJust (z `divide` lcm x y).
Check that gcd of coprime numbers is a unit of the semiring (has an inverse):
y /= 0, coprime x y => isJust (1 `divide` gcd x y).
euclideanLaws :: (Eq a, Euclidean a, Arbitrary a, Show a) => Proxy a -> Laws Source #
Test that a Euclidean instance obey laws of a Euclidean domain.
y /= 0, r == x `rem` y => r == 0 || degree r < degree y,y /= 0, (q, r) == x `quotRem` y => x == q * y + r,y /= 0 => x `quot` x y == fst (x `quotRem` y),y /= 0 => x `rem` x y == snd (x `quotRem` y).
showReadLaws :: (Show a, Read a, Eq a, Arbitrary a) => Proxy a -> Laws #
Tests the following properties:
- Partial Isomorphism:
show/read readMaybe(showa) ≡Justa- Partial Isomorphism:
show/readwith initial space readMaybe(" " ++showa) ≡Justa- Partial Isomorphism:
showsPrec/readsPrec (a,"") `elem`readsPrecp (showsPrecp a "")- Partial Isomorphism:
showList/readList (as,"") `elem`readList(showListas "")- Partial Isomorphism:
showListWithshows/readListDefault (as,"") `elem`readListDefault(showListWithshowsas "")
Note: When using base-4.5 or older, a shim implementation
of readMaybe is used.
storableLaws :: (Storable a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws #
Tests the following Storable properties:
- Set-Get
(pokeElemOffptr ix a >>peekElemOffptr ix') ≡purea- Get-Set
(peekElemOffptr ix >>pokeElemOffptr ix a) ≡purea
genericLaws :: (Generic a, Eq a, Arbitrary a, Show a, Show (Rep a ()), Arbitrary (Rep a ()), Eq (Rep a ())) => Proxy a -> Laws #
Tests the following properties:
Note: This property test is only available when
using base-4.5 or newer.
Note: from and to don't actually care about
the type variable x in , so here we instantiate
it to Rep a x by default. If you would like to instantiate ()x
as something else, please file a bug report.
generic1Laws :: forall (f :: Type -> Type) proxy. (Generic1 f, Eq1 f, Arbitrary1 f, Show1 f, Eq1 (Rep1 f), Show1 (Rep1 f), Arbitrary1 (Rep1 f)) => proxy f -> Laws #
Unary type constructors
alternativeLaws :: forall (f :: Type -> Type) proxy. (Alternative f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws #
altLaws :: forall proxy f. (Alt f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws Source #
applyLaws :: (Apply f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws Source #
applicativeLaws :: forall (f :: Type -> Type) proxy. (Applicative f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws #
contravariantLaws :: forall (f :: Type -> Type) proxy. (Contravariant f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws #
foldableLaws :: forall proxy (f :: Type -> Type). (Foldable f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws #
Tests the following Foldable properties:
- fold
fold≡foldMapid- foldMap
foldMapf ≡foldr(mappend. f)mempty- foldr
foldrf z t ≡appEndo(foldMap(Endo. f) t ) z- foldr'
foldr'f z0 xs ≡ let f' k x z = k$!f x z infoldlf'idxs z0- foldr1
foldr1f t ≡ letJust(xs,x) =unsnoc(toListt) infoldrf x xs- foldl
foldlf z t ≡appEndo(getDual(foldMap(Dual.Endo.flipf) t)) z- foldl'
foldl'f z0 xs ≡ let f' x k z = k$!f z x infoldrf'idxs z0- foldl1
foldl1f t ≡ let x : xs =toListt infoldlf x xs- toList
toList≡foldr(:) []- null
null≡foldr(const(constFalse))True- length
length≡getSum.foldMap(const(Sum1))
Note that this checks to ensure that foldl' and foldr'
are suitably strict.
functorLaws :: forall (f :: Type -> Type) proxy. (Functor f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws #
monadLaws :: forall (f :: Type -> Type) proxy. (Monad f, Applicative f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws #
monadPlusLaws :: forall (f :: Type -> Type) proxy. (MonadPlus f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws #
monadZipLaws :: forall (f :: Type -> Type) proxy. (MonadZip f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws #
plusLaws :: forall proxy f. (Plus f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws Source #
extendedPlusLaws :: forall proxy f. (Plus f, Alternative f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws Source #
traversableLaws :: forall (f :: Type -> Type) proxy. (Traversable f, forall a. Eq a => Eq (f a), forall a. Show a => Show (f a), forall a. Arbitrary a => Arbitrary (f a)) => proxy f -> Laws #
Tests the following Traversable properties:
- Naturality
tfor every applicative transformation.traversef ≡traverse(t.f)t- Identity
traverseIdentity≡Identity- Composition
traverse(Compose.fmapg.f) ≡Compose.fmap(traverseg).traversef- Sequence Naturality
tfor every applicative transformation.sequenceA≡sequenceA.fmaptt- Sequence Identity
sequenceA.fmapIdentity≡Identity- Sequence Composition
sequenceA.fmapCompose≡Compose.fmapsequenceA.sequenceA- foldMap
foldMap≡foldMapDefault- fmap
fmap≡fmapDefault
Where an applicative transformation is a function
t :: (Applicative f, Applicative g) => f a -> g a
preserving the Applicative operations, i.e.
Binary type constructors
bifoldableLaws :: forall proxy (f :: Type -> Type -> Type). (Bifoldable f, forall a b. (Eq a, Eq b) => Eq (f a b), forall a b. (Show a, Show b) => Show (f a b), forall a b. (Arbitrary a, Arbitrary b) => Arbitrary (f a b)) => proxy f -> Laws #
Tests the following Bifunctor properties:
- Bifold Identity
bifold≡bifoldMapidid- BifoldMap Identity
bifoldMapf g ≡bifoldr(mappend.f) (mappend.g)mempty- Bifoldr Identity
bifoldrf g z t ≡appEndo(bifoldMap(Endo.f) (Endo.g) t) z
Note: This property test is only available when this package is built with
base-4.10+ or transformers-0.5+.
bifunctorLaws :: forall proxy (f :: Type -> Type -> Type). (Bifunctor f, forall a b. (Eq a, Eq b) => Eq (f a b), forall a b. (Show a, Show b) => Show (f a b), forall a b. (Arbitrary a, Arbitrary b) => Arbitrary (f a b)) => proxy f -> Laws #
bitraversableLaws :: forall proxy (f :: Type -> Type -> Type). (Bitraversable f, forall a b. (Eq a, Eq b) => Eq (f a b), forall a b. (Show a, Show b) => Show (f a b), forall a b. (Arbitrary a, Arbitrary b) => Arbitrary (f a b)) => proxy f -> Laws #
Tests the following Bitraversable properties:
- Naturality
for every applicative transformationbitraverse(t.f) (t.g) ≡ t.bitraversef gt- Identity
bitraverseIdentityIdentity≡Identity- Composition
Compose.fmap(bitraverseg1 g2).bitraversef1 f2 ≡bitraverse(Compose.fmapg1 g2.f1) (Compose.fmapg2.f2)
Note: This property test is only available when this package is built with
base-4.9+ or transformers-0.5+.
categoryLaws :: forall proxy (c :: Type -> Type -> Type). (Category c, forall a b. (Eq a, Eq b) => Eq (c a b), forall a b. (Show a, Show b) => Show (c a b), forall a b. (Arbitrary a, Arbitrary b) => Arbitrary (c a b)) => proxy c -> Laws #
commutativeCategoryLaws :: forall proxy (c :: Type -> Type -> Type). (Category c, forall a b. (Eq a, Eq b) => Eq (c a b), forall a b. (Show a, Show b) => Show (c a b), forall a b. (Arbitrary a, Arbitrary b) => Arbitrary (c a b)) => proxy c -> Laws #
Test everything from categoryLaws plus the following:
Note: This property test is only available when this package is built with
base-4.9+ or transformers-0.5+.
semigroupoidLaws :: forall proxy s. (Semigroupoid s, forall a b. (Eq a, Eq b) => Eq (s a b), forall a b. (Show a, Show b) => Show (s a b), forall a b. (Arbitrary a, Arbitrary b) => Arbitrary (s a b)) => proxy s -> Laws Source #
Tests the following Semigroupoid properties:
Note: This property test is only available when this package is built with
base-4.9+ or transformers-0.5+.
commutativeSemigroupoidLaws :: forall proxy s. (Semigroupoid s, forall a b. (Eq a, Eq b) => Eq (s a b), forall a b. (Show a, Show b) => Show (s a b), forall a b. (Arbitrary a, Arbitrary b) => Arbitrary (s a b)) => proxy s -> Laws Source #
Tests everything from semigroupoidLaws plus the following:
Note: This property test is only available when this package is built with
base-4.9+ or transformers-0.5+.
muvectorLaws :: (Eq a, Unbox a, Arbitrary a, Show a) => Proxy a -> Laws Source #
Test that a MVector instance obey several laws.
Types
A set of laws associated with a typeclass.
Note: Most of the top-level functions provided
by this library have the shape
`forall a. (Ctx a) => Proxy a -> Laws`. You can just
as easily provide your own Laws in libraries/test suites
using regular QuickCheck machinery.
Constructors
| Laws | |
Fields
| |