-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Laws and tests for numhask
--   
--   Laws and tests for numhask.
@package numhask-test
@version 0.1.0.0

module NumHask.Laws

-- | unification of law equations
data LawArity a
Nonary :: Bool -> LawArity a
Unary :: (a -> Bool) -> LawArity a
Binary :: (a -> a -> Bool) -> LawArity a
Ternary :: (a -> a -> a -> Bool) -> LawArity a
Ornary :: (a -> a -> a -> a -> Bool) -> LawArity a
Failiary :: (a -> Property) -> LawArity a

-- | unification of law equations with 2 types
data LawArity2 a b
Unary10 :: (a -> Bool) -> LawArity2 a b
Unary01 :: (b -> Bool) -> LawArity2 a b
Binary11 :: (a -> b -> Bool) -> LawArity2 a b
Binary20 :: (a -> a -> Bool) -> LawArity2 a b
Ternary21 :: (a -> a -> b -> Bool) -> LawArity2 a b
Ternary12 :: (a -> b -> b -> Bool) -> LawArity2 a b
Ternary30 :: (a -> a -> a -> Bool) -> LawArity2 a b
Quad31 :: (a -> a -> a -> b -> Bool) -> LawArity2 a b
Quad22 :: (a -> a -> b -> b -> Bool) -> LawArity2 a b
Failiary2 :: (a -> Property) -> LawArity2 a b
type Law a = (TestName, LawArity a)
type Law2 a b = (TestName, LawArity2 a b)
testLawOf :: (Arbitrary a, Show a) => [a] -> Law a -> TestTree
testLawOf2 :: (Arbitrary a, Show a, Arbitrary b, Show b) => [(a, b)] -> Law2 a b -> TestTree
idempotentLaws :: (Eq a, Additive a, Multiplicative a) => [Law a]

-- | additive
additiveLaws :: (Eq a, Additive a) => [Law a]

-- | additive with approximate association equality
additiveLaws_ :: (Epsilon a, Additive a) => [Law a]

-- | additive laws with a failure on association
additiveLawsFail :: (Eq a, Additive a, Show a, Arbitrary a) => [Law a]
additiveGroupLaws :: (Eq a, AdditiveGroup a) => [Law a]
multiplicativeLaws :: (Eq a, Multiplicative a) => [Law a]
multiplicativeLawsFail :: (Eq a, Show a, Arbitrary a, Multiplicative a) => [Law a]
multiplicativeMonoidalLaws :: (Eq a, MultiplicativeUnital a) => [Law a]
multiplicativeGroupLaws :: (Eq a, AdditiveUnital a, MultiplicativeGroup a) => [Law a]
multiplicativeGroupLaws_ :: (Epsilon a, MultiplicativeGroup a) => [Law a]
distributionLaws :: (Eq a, Distribution a) => [Law a]
distributionLawsFail :: (Show a, Arbitrary a, Epsilon a, Distribution a) => [Law a]
integralLaws :: (Eq a, Integral a, FromInteger a, ToInteger a) => [Law a]
rationalLaws :: (Eq a, FromRatio a, ToRatio a) => [Law a]
signedLaws :: (Eq a, Signed a) => [Law a]
normedLaws :: forall a b. (Ord b, AdditiveUnital a, AdditiveUnital b, MultiplicativeUnital b, Normed a b) => [Law2 a b]
normedBoundedLaws :: forall a b. (Eq a, Bounded a, Ord b, AdditiveUnital a, AdditiveUnital b, MultiplicativeUnital b, Normed a b) => [Law2 a b]
metricIntegralLaws :: forall a b. (FromInteger b, Ord b, Signed b, Epsilon b, Metric a b, AdditiveGroup b) => [Law2 a b]
metricIntegralBoundedLaws :: forall a b. (FromInteger b, Bounded b, Ord b, Signed b, Epsilon b, Metric a b) => [Law2 a b]
metricRationalLaws :: forall a b. (FromRatio b, Ord b, Signed b, Epsilon b, Metric a b, Normed a b, Additive a, AdditiveGroup b) => [Law2 a b]
upperBoundedFieldLaws :: forall a. (Eq a, UpperBoundedField a) => [Law a]
lowerBoundedFieldLaws :: forall a. (Eq a, LowerBoundedField a) => [Law a]
quotientFieldLaws :: (Field a, QuotientField a Integer, FromInteger a, Ord a) => [Law2 a Integer]
expFieldLaws :: forall a b. (FromInteger b, AdditiveUnital b, ExpField a, Normed a b, Epsilon a, Ord a, Ord b) => [Law2 a b]
additiveBasisLaws :: (Epsilon (r a), AdditiveBasis r a) => [Law (r a)]
additiveGroupBasisLaws :: (Eq (r a), Singleton r, AdditiveGroupBasis r a) => [Law (r a)]
multiplicativeBasisLaws :: (Eq (r a), Singleton r, MultiplicativeBasis r a) => [Law (r a)]
multiplicativeGroupBasisLaws :: (Epsilon a, Epsilon (r a), Singleton r, MultiplicativeGroupBasis r a) => [Law (r a)]
additiveModuleLaws :: (Epsilon a, Epsilon (r a), AdditiveModule r a, Additive (r a)) => [Law2 (r a) a]
additiveGroupModuleLaws :: (Epsilon a, Epsilon (r a), AdditiveGroupModule r a, Additive (r a)) => [Law2 (r a) a]
multiplicativeModuleLaws :: (Epsilon a, Epsilon (r a), MultiplicativeModule r a, Additive (r a)) => [Law2 (r a) a]
multiplicativeGroupModuleLawsFail :: (Epsilon a, Epsilon (r a), MultiplicativeGroupModule r a) => [Law2 (r a) a]
expFieldContainerLaws :: (ExpField (r a), Foldable r, ExpField a, Epsilon a, Signed a, FromRatio a, Epsilon (r a), Ord a) => [Law (r a)]
tensorProductLaws :: (Eq (r (r a)), Additive (r (r a)), TensorProduct (r a), Epsilon (r a), Additive (r a)) => [Law2 (r a) a]
banachLaws :: (Foldable r, Epsilon (r a), Banach r a, Singleton r, Signed a, FromRatio a, Ord a) => [Law2 (r a) a]
hilbertLaws :: (MultiplicativeModule r a, Epsilon a, Epsilon (r a), Hilbert r a, Additive (r a)) => [Law2 (r a) a]

-- | semiring
semiringLaws :: (Epsilon a, Semiring a) => [Law a]

-- | ring
ringLaws :: (Epsilon a, Ring a) => [Law a]

-- | starsemiring
starSemiringLaws :: (Epsilon a, StarSemiring a) => [Law a]

-- | involutive ring
involutiveRingLaws :: forall a. (Eq a, MultiplicativeUnital a, InvolutiveRing a) => [Law a]
integralsLaws :: (Eq a, AdditiveGroup a, Integral a, Signed a, ToInteger a, FromInteger a, Multiplicative a) => [Law a]
