| License | MIT |
|---|---|
| Maintainer | mail@doisinkidney.com |
| Stability | experimental |
| Safe Haskell | None |
| Language | Haskell2010 |
Test.Semiring
Contents
Description
This module provides functions which can be quickly converted into smallcheck or QuickCheck-like properties. The functions are of the form:
a -> Either String String
where the left case is failure of the test, and the right case is success.
For smallcheck, this function can be used directly as a property:
smallCheck 10 (plusId :: UnaryLaws Integer)
(the typealias is provided as well)
For QuickCheck, you might want to provide an instance like this:
instance Testable (Either String String) where property = either (`counterexample` False) (const (property True))
And then testing is as simple as:
quickCheck (plusAssoc :: TernaryLaws Integer)
There are also functions provided to test multiple laws at once. Putting all of
this together, writing a test for all the semiring laws for, say, Integer
looks like this:
quickCheck (unaryLaws :: UnaryLaws Integer) quickCheck (binaryLaws :: BinaryLaws Integer) quickCheck (ternaryLaws :: TernaryLaws Integer)
Synopsis
- type UnaryLaws a = a -> Either String String
- type BinaryLaws a = a -> a -> Either String String
- type TernaryLaws a = a -> a -> a -> Either String String
- plusId :: (Eq a, Semiring a, Show a) => a -> Either String String
- mulId :: (Eq a, Semiring a, Show a) => a -> Either String String
- annihilateL :: (Eq a, Semiring a, Show a) => a -> Either String String
- annihilateR :: (Eq a, Semiring a, Show a) => a -> Either String String
- unaryLaws :: (Eq a, Semiring a, Show a) => a -> Either String String
- plusComm :: (Eq a, Semiring a, Show a) => a -> a -> Either String String
- binaryLaws :: (Eq a, Semiring a, Show a) => a -> a -> Either String String
- plusAssoc :: (Eq a, Semiring a, Show a) => a -> a -> a -> Either String String
- mulAssoc :: (Eq a, Semiring a, Show a) => a -> a -> a -> Either String String
- mulDistribL :: (Eq a, Semiring a, Show a) => a -> a -> a -> Either String String
- mulDistribR :: (Eq a, Semiring a, Show a) => a -> a -> a -> Either String String
- ternaryLaws :: (Eq a, Semiring a, Show a) => a -> a -> a -> Either String String
- nearUnaryLaws :: (Eq a, Semiring a, Show a) => a -> Either String String
- nearTernaryLaws :: (Eq a, Semiring a, Show a) => a -> a -> a -> Either String String
- starLaw :: (Eq a, StarSemiring a, Show a) => a -> Either String String
- plusLaw :: (Eq a, StarSemiring a, Show a) => a -> Either String String
- starLaws :: (Eq a, StarSemiring a, Show a) => a -> Either String String
- zeroLaw :: (Eq a, DetectableZero a, Show a) => a -> Either String String
- zeroIsZero :: (DetectableZero a, Show a) => f a -> Either String String
- zeroLaws :: (DetectableZero a, Show a, Eq a) => a -> Either String String
- ordMulLaw :: (Ord a, Semiring a, Show a) => a -> a -> a -> Either String String
- ordAddLaw :: (Ord a, Semiring a, Show a) => a -> a -> a -> Either String String
- ordLaws :: (Ord a, Semiring a, Show a) => a -> a -> a -> Either String String
Type Aliases
type UnaryLaws a = a -> Either String String Source #
Typealias for unary laws. Can be used like so:
smallCheck 10 (unaryLaws :: UnaryLaws Int)
type BinaryLaws a = a -> a -> Either String String Source #
Typealias for binary laws. Can be used like so:
smallCheck 8 (binaryLaws :: BinaryLaws Int)
type TernaryLaws a = a -> a -> a -> Either String String Source #
Typealias for ternary laws. Can be used like so:
smallCheck 6 (ternaryLaws :: TernaryLaws Int)
Semiring Laws
Unary
unaryLaws :: (Eq a, Semiring a, Show a) => a -> Either String String Source #
A test for all three unary laws for Semirings (plusId, mulId,
annihilateL, and annihilateR).
Binary
Ternary
ternaryLaws :: (Eq a, Semiring a, Show a) => a -> a -> a -> Either String String Source #
A test for all of the ternary laws for Semirings (plusAssoc, mulAssoc,
mulDistribL, mulDistribR).
Near-semiring laws
Unary
nearUnaryLaws :: (Eq a, Semiring a, Show a) => a -> Either String String Source #
A test for the unary laws for near-Semirings (plusId, mulId, and
annihilateR).
Ternary
nearTernaryLaws :: (Eq a, Semiring a, Show a) => a -> a -> a -> Either String String Source #
A test for all of the ternary laws for near-Semirings (plusAssoc,
mulAssoc, mulDistribR).
StarSemiring Laws
Unary
plusLaw :: (Eq a, StarSemiring a, Show a) => a -> Either String String Source #
The plus law for StarSemirings.
plusx = x<.>starx
starLaws :: (Eq a, StarSemiring a, Show a) => a -> Either String String Source #
The laws for StarSemirings (starLaw, plusLaw).
DetectableZero Laws
Unary
zeroIsZero :: (DetectableZero a, Show a) => f a -> Either String String Source #
zeroLaws :: (DetectableZero a, Show a, Eq a) => a -> Either String String Source #
The laws for DetectableZero Semirings (zeroLaw, zeroIsZero).