Copyright | (c) Michal Konecny |
---|---|
License | BSD3 |
Maintainer | mikkonecny@gmail.com |
Stability | experimental |
Portability | portable |
Safe Haskell | None |
Language | Haskell98 |
- type CanAdd t1 t2 = (CanAddAsymmetric t1 t2, CanAddAsymmetric t2 t1, AddType t1 t2 ~ AddType t2 t1)
- class CanAddAsymmetric t1 t2 where
- type AddType t1 t2
- type CanAddThis t1 t2 = (CanAdd t1 t2, AddType t1 t2 ~ t1)
- type CanAddSameType t = CanAddThis t t
- (+) :: CanAddAsymmetric t1 t2 => t1 -> t2 -> AddType t1 t2
- sum :: (CanAddSameType t, ConvertibleExactly Integer t) => [t] -> t
- specCanAdd :: (CanAddXX t1 t1, CanAddXX t1 t2, CanAddXX t1 t3, CanAddXX t2 t3, CanAddXX t1 (AddType t2 t3), CanAddXX (AddType t1 t2) t3, ConvertibleExactly Integer t1, CanTestPosNeg t1, HasEqCertainly (AddType t1 (AddType t2 t3)) (AddType (AddType t1 t2) t3)) => T t1 -> T t2 -> T t3 -> Spec
- specCanAddNotMixed :: (CanAddXX t t, CanAddXX t (AddType t t), ConvertibleExactly Integer t, CanTestPosNeg t) => T t -> Spec
- specCanAddSameType :: (ConvertibleExactly Integer t, Show t, HasEqCertainly t t, CanAddSameType t) => T t -> Spec
- type CanAddX t1 t2 = (CanAdd t1 t2, Show t1, Arbitrary t1, Show t2, Arbitrary t2, Show (AddType t1 t2), HasEqCertainly t1 (AddType t1 t2), HasEqCertainly t2 (AddType t1 t2), HasEqCertainly (AddType t1 t2) (AddType t1 t2), HasOrderCertainly t1 (AddType t1 t2), HasOrderCertainly t2 (AddType t1 t2), HasOrderCertainly (AddType t1 t2) (AddType t1 t2))
- type CanAddXX t1 t2 = (CanAddX t1 t2, HasEqCertainly (AddType t1 t2) (AddType t2 t1))
- class CanSub t1 t2 where
- type SubType t1 t2
- type CanSubThis t1 t2 = (CanSub t1 t2, SubType t1 t2 ~ t1)
- type CanSubSameType t = CanSubThis t t
- (-) :: CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- specCanSub :: (CanSubX t1 t1, CanSubX t1 t2, CanNeg t2, CanAdd t1 (NegType t2), HasEqCertainly (SubType t1 t2) (AddType t1 (NegType t2)), Show (AddType t1 (NegType t2)), ConvertibleExactly Integer t1) => T t1 -> T t2 -> Spec
- specCanSubNotMixed :: (CanSubX t t, CanSubX t (SubType t t), CanNeg t, CanAdd t (NegType t), Show (AddType t (NegType t)), HasEqCertainly (SubType t t) (AddType t (NegType t)), ConvertibleExactly Integer t) => T t -> Spec
- type CanSubX t1 t2 = (CanSub t1 t2, HasEqCertainly t1 (SubType t1 t2), CanAddXX t1 t2, Show (SubType t1 t2))
Addition
type CanAdd t1 t2 = (CanAddAsymmetric t1 t2, CanAddAsymmetric t2 t1, AddType t1 t2 ~ AddType t2 t1) Source #
class CanAddAsymmetric t1 t2 where Source #
A replacement for Prelude's +
. If t1 = t2
and Num t1
,
then one can use the default implementation to mirror Prelude's +
.
add :: t1 -> t2 -> AddType t1 t2 Source #
add :: (AddType t1 t2 ~ t1, t1 ~ t2, Num t1) => t1 -> t1 -> t1 Source #
type CanAddThis t1 t2 = (CanAdd t1 t2, AddType t1 t2 ~ t1) Source #
type CanAddSameType t = CanAddThis t t Source #
(+) :: CanAddAsymmetric t1 t2 => t1 -> t2 -> AddType t1 t2 infixl 6 Source #
sum :: (CanAddSameType t, ConvertibleExactly Integer t) => [t] -> t Source #
Tests
specCanAdd :: (CanAddXX t1 t1, CanAddXX t1 t2, CanAddXX t1 t3, CanAddXX t2 t3, CanAddXX t1 (AddType t2 t3), CanAddXX (AddType t1 t2) t3, ConvertibleExactly Integer t1, CanTestPosNeg t1, HasEqCertainly (AddType t1 (AddType t2 t3)) (AddType (AddType t1 t2) t3)) => T t1 -> T t2 -> T t3 -> Spec Source #
HSpec properties that each implementation of CanAdd should satisfy.
specCanAddNotMixed :: (CanAddXX t t, CanAddXX t (AddType t t), ConvertibleExactly Integer t, CanTestPosNeg t) => T t -> Spec Source #
HSpec properties that each implementation of CanAdd should satisfy.
specCanAddSameType :: (ConvertibleExactly Integer t, Show t, HasEqCertainly t t, CanAddSameType t) => T t -> Spec Source #
HSpec properties that each implementation of CanAddSameType should satisfy.
type CanAddX t1 t2 = (CanAdd t1 t2, Show t1, Arbitrary t1, Show t2, Arbitrary t2, Show (AddType t1 t2), HasEqCertainly t1 (AddType t1 t2), HasEqCertainly t2 (AddType t1 t2), HasEqCertainly (AddType t1 t2) (AddType t1 t2), HasOrderCertainly t1 (AddType t1 t2), HasOrderCertainly t2 (AddType t1 t2), HasOrderCertainly (AddType t1 t2) (AddType t1 t2)) Source #
Compound type constraint useful for test definition.
type CanAddXX t1 t2 = (CanAddX t1 t2, HasEqCertainly (AddType t1 t2) (AddType t2 t1)) Source #
Compound type constraint useful for test definition.
Subtraction
class CanSub t1 t2 where Source #
A replacement for Prelude's binary -
.
If CanNeg t2
and CanAdd t1 (NegType t2)
,
then one can use the default implementation
via a-b = a + (-b)
.
sub :: t1 -> t2 -> SubType t1 t2 Source #
sub :: (SubType t1 t2 ~ AddType t1 (NegType t2), CanNeg t2, CanAdd t1 (NegType t2)) => t1 -> t2 -> SubType t1 t2 Source #
CanSub Double Double Source # | |
CanSub Double Int Source # | |
CanSub Double Integer Source # | |
CanSub Double Rational Source # | |
CanSub Int Double Source # | |
CanSub Int Int Source # | |
CanSub Int Integer Source # | |
CanSub Int Rational Source # | |
CanSub Integer Double Source # | |
CanSub Integer Int Source # | |
CanSub Integer Integer Source # | |
CanSub Integer Rational Source # | |
CanSub Rational Double Source # | |
CanSub Rational Int Source # | |
CanSub Rational Integer Source # | |
CanSub Rational Rational Source # | |
CanSub a b => CanSub [a] [b] Source # | |
CanSub a b => CanSub (Maybe a) (Maybe b) Source # | |
type CanSubThis t1 t2 = (CanSub t1 t2, SubType t1 t2 ~ t1) Source #
type CanSubSameType t = CanSubThis t t Source #
Tests
specCanSub :: (CanSubX t1 t1, CanSubX t1 t2, CanNeg t2, CanAdd t1 (NegType t2), HasEqCertainly (SubType t1 t2) (AddType t1 (NegType t2)), Show (AddType t1 (NegType t2)), ConvertibleExactly Integer t1) => T t1 -> T t2 -> Spec Source #
HSpec properties that each implementation of CanSub should satisfy.