algebra 4.3 → 4.3.1
raw patch · 4 files changed
+126/−72 lines, 4 filesdep ~basedep ~containersdep ~mtlPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: base, containers, mtl, semigroupoids, transformers
API changes (from Hackage documentation)
- Numeric.Algebra.Class: instance (Numeric.Algebra.Class.Semiring r, GHC.Classes.Ord a) => Numeric.Algebra.Class.Algebra r (Data.Set.Base.Set a)
- Numeric.Algebra.Class: instance (Numeric.Algebra.Class.Semiring r, GHC.Classes.Ord a) => Numeric.Algebra.Class.Coalgebra r (Data.Set.Base.Set a)
- Numeric.Algebra.Class: instance (Numeric.Algebra.Class.Semiring r, GHC.Classes.Ord a, Numeric.Additive.Class.Additive b) => Numeric.Algebra.Class.Coalgebra r (Data.Map.Base.Map a b)
- Numeric.Algebra.Class: instance (Numeric.Algebra.Class.Semiring r, Numeric.Additive.Class.Additive b) => Numeric.Algebra.Class.Coalgebra r (Data.IntMap.Base.IntMap b)
- Numeric.Algebra.Class: instance Numeric.Algebra.Class.Semiring r => Numeric.Algebra.Class.Algebra r (Data.Sequence.Seq a)
- Numeric.Algebra.Class: instance Numeric.Algebra.Class.Semiring r => Numeric.Algebra.Class.Algebra r Data.IntSet.Base.IntSet
- Numeric.Algebra.Class: instance Numeric.Algebra.Class.Semiring r => Numeric.Algebra.Class.Coalgebra r (Data.Sequence.Seq a)
- Numeric.Algebra.Class: instance Numeric.Algebra.Class.Semiring r => Numeric.Algebra.Class.Coalgebra r Data.IntSet.Base.IntSet
- Numeric.Algebra.Commutative: instance (Numeric.Algebra.Commutative.Commutative r, Numeric.Algebra.Class.Semiring r) => Numeric.Algebra.Commutative.CocommutativeCoalgebra r Data.IntSet.Base.IntSet
- Numeric.Algebra.Commutative: instance (Numeric.Algebra.Commutative.Commutative r, Numeric.Algebra.Class.Semiring r) => Numeric.Algebra.Commutative.CommutativeAlgebra r Data.IntSet.Base.IntSet
- Numeric.Algebra.Commutative: instance (Numeric.Algebra.Commutative.Commutative r, Numeric.Algebra.Class.Semiring r, GHC.Classes.Ord a) => Numeric.Algebra.Commutative.CocommutativeCoalgebra r (Data.Set.Base.Set a)
- Numeric.Algebra.Commutative: instance (Numeric.Algebra.Commutative.Commutative r, Numeric.Algebra.Class.Semiring r, GHC.Classes.Ord a) => Numeric.Algebra.Commutative.CommutativeAlgebra r (Data.Set.Base.Set a)
- Numeric.Algebra.Commutative: instance (Numeric.Algebra.Commutative.Commutative r, Numeric.Algebra.Class.Semiring r, GHC.Classes.Ord a, Numeric.Additive.Class.Abelian b) => Numeric.Algebra.Commutative.CocommutativeCoalgebra r (Data.Map.Base.Map a b)
- Numeric.Algebra.Commutative: instance (Numeric.Algebra.Commutative.Commutative r, Numeric.Algebra.Class.Semiring r, Numeric.Additive.Class.Abelian b) => Numeric.Algebra.Commutative.CocommutativeCoalgebra r (Data.IntMap.Base.IntMap b)
- Numeric.Algebra.Idempotent: instance (Numeric.Algebra.Class.Semiring r, Numeric.Algebra.Idempotent.Band r) => Numeric.Algebra.Idempotent.IdempotentAlgebra r Data.IntSet.Base.IntSet
- Numeric.Algebra.Idempotent: instance (Numeric.Algebra.Class.Semiring r, Numeric.Algebra.Idempotent.Band r) => Numeric.Algebra.Idempotent.IdempotentCoalgebra r Data.IntSet.Base.IntSet
- Numeric.Algebra.Idempotent: instance (Numeric.Algebra.Class.Semiring r, Numeric.Algebra.Idempotent.Band r, GHC.Classes.Ord a) => Numeric.Algebra.Idempotent.IdempotentAlgebra r (Data.Set.Base.Set a)
- Numeric.Algebra.Idempotent: instance (Numeric.Algebra.Class.Semiring r, Numeric.Algebra.Idempotent.Band r, GHC.Classes.Ord c) => Numeric.Algebra.Idempotent.IdempotentCoalgebra r (Data.Set.Base.Set c)
- Numeric.Algebra.Unital: instance (Numeric.Algebra.Class.Monoidal r, Numeric.Algebra.Class.Semiring r) => Numeric.Algebra.Unital.Bialgebra r (Data.Sequence.Seq a)
- Numeric.Algebra.Unital: instance (Numeric.Algebra.Class.Monoidal r, Numeric.Algebra.Class.Semiring r) => Numeric.Algebra.Unital.UnitalAlgebra r (Data.Sequence.Seq a)
- Numeric.Algebra.Unital: instance Numeric.Algebra.Class.Semiring r => Numeric.Algebra.Unital.CounitalCoalgebra r (Data.Sequence.Seq a)
- Numeric.Order.Class: instance GHC.Classes.Ord a => Numeric.Order.Class.Order (Data.Set.Base.Set a)
- Numeric.Order.LocallyFinite: instance GHC.Classes.Ord a => Numeric.Order.LocallyFinite.LocallyFiniteOrder (Data.Set.Base.Set a)
+ Numeric.Algebra.Class: instance (Numeric.Algebra.Class.Semiring r, GHC.Classes.Ord a) => Numeric.Algebra.Class.Algebra r (Data.Set.Internal.Set a)
+ Numeric.Algebra.Class: instance (Numeric.Algebra.Class.Semiring r, GHC.Classes.Ord a) => Numeric.Algebra.Class.Coalgebra r (Data.Set.Internal.Set a)
+ Numeric.Algebra.Class: instance (Numeric.Algebra.Class.Semiring r, GHC.Classes.Ord a, Numeric.Additive.Class.Additive b) => Numeric.Algebra.Class.Coalgebra r (Data.Map.Internal.Map a b)
+ Numeric.Algebra.Class: instance (Numeric.Algebra.Class.Semiring r, Numeric.Additive.Class.Additive b) => Numeric.Algebra.Class.Coalgebra r (Data.IntMap.Internal.IntMap b)
+ Numeric.Algebra.Class: instance Numeric.Algebra.Class.Semiring r => Numeric.Algebra.Class.Algebra r (Data.Sequence.Internal.Seq a)
+ Numeric.Algebra.Class: instance Numeric.Algebra.Class.Semiring r => Numeric.Algebra.Class.Algebra r Data.IntSet.Internal.IntSet
+ Numeric.Algebra.Class: instance Numeric.Algebra.Class.Semiring r => Numeric.Algebra.Class.Coalgebra r (Data.Sequence.Internal.Seq a)
+ Numeric.Algebra.Class: instance Numeric.Algebra.Class.Semiring r => Numeric.Algebra.Class.Coalgebra r Data.IntSet.Internal.IntSet
+ Numeric.Algebra.Commutative: instance (Numeric.Algebra.Commutative.Commutative r, Numeric.Algebra.Class.Semiring r) => Numeric.Algebra.Commutative.CocommutativeCoalgebra r Data.IntSet.Internal.IntSet
+ Numeric.Algebra.Commutative: instance (Numeric.Algebra.Commutative.Commutative r, Numeric.Algebra.Class.Semiring r) => Numeric.Algebra.Commutative.CommutativeAlgebra r Data.IntSet.Internal.IntSet
+ Numeric.Algebra.Commutative: instance (Numeric.Algebra.Commutative.Commutative r, Numeric.Algebra.Class.Semiring r, GHC.Classes.Ord a) => Numeric.Algebra.Commutative.CocommutativeCoalgebra r (Data.Set.Internal.Set a)
+ Numeric.Algebra.Commutative: instance (Numeric.Algebra.Commutative.Commutative r, Numeric.Algebra.Class.Semiring r, GHC.Classes.Ord a) => Numeric.Algebra.Commutative.CommutativeAlgebra r (Data.Set.Internal.Set a)
+ Numeric.Algebra.Commutative: instance (Numeric.Algebra.Commutative.Commutative r, Numeric.Algebra.Class.Semiring r, GHC.Classes.Ord a, Numeric.Additive.Class.Abelian b) => Numeric.Algebra.Commutative.CocommutativeCoalgebra r (Data.Map.Internal.Map a b)
+ Numeric.Algebra.Commutative: instance (Numeric.Algebra.Commutative.Commutative r, Numeric.Algebra.Class.Semiring r, Numeric.Additive.Class.Abelian b) => Numeric.Algebra.Commutative.CocommutativeCoalgebra r (Data.IntMap.Internal.IntMap b)
+ Numeric.Algebra.Idempotent: instance (Numeric.Algebra.Class.Semiring r, Numeric.Algebra.Idempotent.Band r) => Numeric.Algebra.Idempotent.IdempotentAlgebra r Data.IntSet.Internal.IntSet
+ Numeric.Algebra.Idempotent: instance (Numeric.Algebra.Class.Semiring r, Numeric.Algebra.Idempotent.Band r) => Numeric.Algebra.Idempotent.IdempotentCoalgebra r Data.IntSet.Internal.IntSet
+ Numeric.Algebra.Idempotent: instance (Numeric.Algebra.Class.Semiring r, Numeric.Algebra.Idempotent.Band r, GHC.Classes.Ord a) => Numeric.Algebra.Idempotent.IdempotentAlgebra r (Data.Set.Internal.Set a)
+ Numeric.Algebra.Idempotent: instance (Numeric.Algebra.Class.Semiring r, Numeric.Algebra.Idempotent.Band r, GHC.Classes.Ord c) => Numeric.Algebra.Idempotent.IdempotentCoalgebra r (Data.Set.Internal.Set c)
+ Numeric.Algebra.Unital: instance (Numeric.Algebra.Class.Monoidal r, Numeric.Algebra.Class.Semiring r) => Numeric.Algebra.Unital.Bialgebra r (Data.Sequence.Internal.Seq a)
+ Numeric.Algebra.Unital: instance (Numeric.Algebra.Class.Monoidal r, Numeric.Algebra.Class.Semiring r) => Numeric.Algebra.Unital.UnitalAlgebra r (Data.Sequence.Internal.Seq a)
+ Numeric.Algebra.Unital: instance Numeric.Algebra.Class.Semiring r => Numeric.Algebra.Unital.CounitalCoalgebra r (Data.Sequence.Internal.Seq a)
+ Numeric.Order.Class: instance GHC.Classes.Ord a => Numeric.Order.Class.Order (Data.Set.Internal.Set a)
+ Numeric.Order.LocallyFinite: instance GHC.Classes.Ord a => Numeric.Order.LocallyFinite.LocallyFiniteOrder (Data.Set.Internal.Set a)
+ Numeric.Ring.Endomorphism: instance Data.Semigroup.Semigroup (Numeric.Ring.Endomorphism.End r)
- Numeric.Additive.Class: class Additive r where sinnum1p y0 x0 = f x0 (1 + y0) where f x y | even y = f (x + x) (y `quot` 2) | y == 1 = x | otherwise = g (x + x) (pred y `quot` 2) x g x y z | even y = g (x + x) (y `quot` 2) z | y == 1 = x + z | otherwise = g (x + x) (pred y `quot` 2) (x + z) sumWith1 f = maybe (error "Numeric.Additive.Semigroup.sumWith1: empty structure") id . foldl' mf Nothing where mf Nothing y = Just $! f y mf (Just x) y = Just $! x + f y
+ Numeric.Additive.Class: class Additive r
- Numeric.Additive.Group: class (LeftModule Integer r, RightModule Integer r, Monoidal r) => Group r where times y0 x0 = case compare y0 0 of { LT -> f (negate x0) (negate y0) EQ -> zero GT -> f x0 y0 } where f x y | even y = f (x + x) (y `quot` 2) | y == 1 = x | otherwise = g (x + x) ((y - 1) `quot` 2) x g x y z | even y = g (x + x) (y `quot` 2) z | y == 1 = x + z | otherwise = g (x + x) ((y - 1) `quot` 2) (x + z) negate a = zero - a a - b = a + negate b subtract a b = negate a + b
+ Numeric.Additive.Group: class (LeftModule Integer r, RightModule Integer r, Monoidal r) => Group r
- Numeric.Algebra: class Additive r where sinnum1p y0 x0 = f x0 (1 + y0) where f x y | even y = f (x + x) (y `quot` 2) | y == 1 = x | otherwise = g (x + x) (pred y `quot` 2) x g x y z | even y = g (x + x) (y `quot` 2) z | y == 1 = x + z | otherwise = g (x + x) (pred y `quot` 2) (x + z) sumWith1 f = maybe (error "Numeric.Additive.Semigroup.sumWith1: empty structure") id . foldl' mf Nothing where mf Nothing y = Just $! f y mf (Just x) y = Just $! x + f y
+ Numeric.Algebra: class Additive r
- Numeric.Algebra: class Unital r => DecidableUnits r where isUnit = isJust . recipUnit x0 ^? y0 = case compare y0 0 of { LT -> fmap (`f` negate y0) (recipUnit x0) EQ -> Just one GT -> Just (f x0 y0) } where f x y | even y = f (x * x) (y `quot` 2) | y == 1 = x | otherwise = g (x * x) ((y - 1) `quot` 2) x g x y z | even y = g (x * x) (y `quot` 2) z | y == 1 = x * z | otherwise = g (x * x) ((y - 1) `quot` 2) (x * z)
+ Numeric.Algebra: class Unital r => DecidableUnits r
- Numeric.Algebra: class Unital r => Division r where recip a = one / a a / b = a * recip b a \\ b = recip a * b x0 ^ y0 = case compare y0 0 of { LT -> f (recip x0) (negate y0) EQ -> one GT -> f x0 y0 } where f x y | even y = f (x * x) (y `quot` 2) | y == 1 = x | otherwise = g (x * x) ((y - 1) `quot` 2) x g x y z | even y = g (x * x) (y `quot` 2) z | y == 1 = x * z | otherwise = g (x * x) ((y - 1) `quot` 2) (x * z)
+ Numeric.Algebra: class Unital r => Division r
- Numeric.Algebra: class (LeftModule Integer r, RightModule Integer r, Monoidal r) => Group r where times y0 x0 = case compare y0 0 of { LT -> f (negate x0) (negate y0) EQ -> zero GT -> f x0 y0 } where f x y | even y = f (x + x) (y `quot` 2) | y == 1 = x | otherwise = g (x + x) ((y - 1) `quot` 2) x g x y z | even y = g (x + x) (y `quot` 2) z | y == 1 = x + z | otherwise = g (x + x) ((y - 1) `quot` 2) (x + z) negate a = zero - a a - b = a + negate b subtract a b = negate a + b
+ Numeric.Algebra: class (LeftModule Integer r, RightModule Integer r, Monoidal r) => Group r
- Numeric.Algebra: class Order a => LocallyFiniteOrder a where moebiusInversion x y = case order x y of { Just EQ -> one Just LT -> sumWith (\ z -> if z < y then moebiusInversion x z else zero) $ range x y _ -> zero }
+ Numeric.Algebra: class Order a => LocallyFiniteOrder a
- Numeric.Algebra: class (LeftModule Natural m, RightModule Natural m) => Monoidal m where sinnum 0 _ = zero sinnum n x0 = f x0 n where f x y | even y = f (x + x) (y `quot` 2) | y == 1 = x | otherwise = g (x + x) (pred y `quot` 2) x g x y z | even y = g (x + x) (y `quot` 2) z | y == 1 = x + z | otherwise = g (x + x) (pred y `quot` 2) (x + z) sumWith f = foldl' (\ b a -> b + f a) zero
+ Numeric.Algebra: class (LeftModule Natural m, RightModule Natural m) => Monoidal m
- Numeric.Algebra: class Multiplicative r where pow1p x0 y0 = f x0 (y0 + 1) where f x y | even y = f (x * x) (y `quot` 2) | y == 1 = x | otherwise = g (x * x) ((y - 1) `quot` 2) x g x y z | even y = g (x * x) (y `quot` 2) z | y == 1 = x * z | otherwise = g (x * x) ((y - 1) `quot` 2) (x * z) productWith1 f = maybe (error "Numeric.Multiplicative.Semigroup.productWith1: empty structure") id . foldl' mf Nothing where mf Nothing y = Just $! f y mf (Just x) y = Just $! x * f y
+ Numeric.Algebra: class Multiplicative r
- Numeric.Algebra: class Order a where a <~ b = maybe False (<= EQ) (order a b) a < b = order a b == Just LT a >~ b = b <~ a a > b = order a b == Just GT a ~~ b = order a b == Just EQ a /~ b = order a b /= Just EQ order a b | a <~ b = Just $ if b <~ a then EQ else LT | b <~ a = Just GT | otherwise = Nothing comparable a b = maybe False (const True) (order a b)
+ Numeric.Algebra: class Order a
- Numeric.Algebra: class (Semiring r, Unital r, Monoidal r) => Rig r where fromNatural n = sinnum n one
+ Numeric.Algebra: class (Semiring r, Unital r, Monoidal r) => Rig r
- Numeric.Algebra: class (Rig r, Rng r) => Ring r where fromInteger n = times n one
+ Numeric.Algebra: class (Rig r, Rng r) => Ring r
- Numeric.Algebra: class Multiplicative r => Unital r where pow _ 0 = one pow x0 y0 = f x0 y0 where f x y | even y = f (x * x) (y `quot` 2) | y == 1 = x | otherwise = g (x * x) ((y - 1) `quot` 2) x g x y z | even y = g (x * x) (y `quot` 2) z | y == 1 = x * z | otherwise = g (x * x) ((y - 1) `quot` 2) (x * z) productWith f = foldl' (\ b a -> b * f a) one
+ Numeric.Algebra: class Multiplicative r => Unital r
- Numeric.Algebra.Class: class (LeftModule Natural m, RightModule Natural m) => Monoidal m where sinnum 0 _ = zero sinnum n x0 = f x0 n where f x y | even y = f (x + x) (y `quot` 2) | y == 1 = x | otherwise = g (x + x) (pred y `quot` 2) x g x y z | even y = g (x + x) (y `quot` 2) z | y == 1 = x + z | otherwise = g (x + x) (pred y `quot` 2) (x + z) sumWith f = foldl' (\ b a -> b + f a) zero
+ Numeric.Algebra.Class: class (LeftModule Natural m, RightModule Natural m) => Monoidal m
- Numeric.Algebra.Class: class Multiplicative r where pow1p x0 y0 = f x0 (y0 + 1) where f x y | even y = f (x * x) (y `quot` 2) | y == 1 = x | otherwise = g (x * x) ((y - 1) `quot` 2) x g x y z | even y = g (x * x) (y `quot` 2) z | y == 1 = x * z | otherwise = g (x * x) ((y - 1) `quot` 2) (x * z) productWith1 f = maybe (error "Numeric.Multiplicative.Semigroup.productWith1: empty structure") id . foldl' mf Nothing where mf Nothing y = Just $! f y mf (Just x) y = Just $! x * f y
+ Numeric.Algebra.Class: class Multiplicative r
- Numeric.Algebra.Division: class Unital r => Division r where recip a = one / a a / b = a * recip b a \\ b = recip a * b x0 ^ y0 = case compare y0 0 of { LT -> f (recip x0) (negate y0) EQ -> one GT -> f x0 y0 } where f x y | even y = f (x * x) (y `quot` 2) | y == 1 = x | otherwise = g (x * x) ((y - 1) `quot` 2) x g x y z | even y = g (x * x) (y `quot` 2) z | y == 1 = x * z | otherwise = g (x * x) ((y - 1) `quot` 2) (x * z)
+ Numeric.Algebra.Division: class Unital r => Division r
- Numeric.Algebra.Unital: class Multiplicative r => Unital r where pow _ 0 = one pow x0 y0 = f x0 y0 where f x y | even y = f (x * x) (y `quot` 2) | y == 1 = x | otherwise = g (x * x) ((y - 1) `quot` 2) x g x y z | even y = g (x * x) (y `quot` 2) z | y == 1 = x * z | otherwise = g (x * x) ((y - 1) `quot` 2) (x * z) productWith f = foldl' (\ b a -> b * f a) one
+ Numeric.Algebra.Unital: class Multiplicative r => Unital r
- Numeric.Algebra.Unital.UnitNormalForm: class (DecidableUnits r, DecidableAssociates r) => UnitNormalForm r where splitUnit x | isZero x = (one, zero) | otherwise = (x, one)
+ Numeric.Algebra.Unital.UnitNormalForm: class (DecidableUnits r, DecidableAssociates r) => UnitNormalForm r
- Numeric.Decidable.Units: class Unital r => DecidableUnits r where isUnit = isJust . recipUnit x0 ^? y0 = case compare y0 0 of { LT -> fmap (`f` negate y0) (recipUnit x0) EQ -> Just one GT -> Just (f x0 y0) } where f x y | even y = f (x * x) (y `quot` 2) | y == 1 = x | otherwise = g (x * x) ((y - 1) `quot` 2) x g x y z | even y = g (x * x) (y `quot` 2) z | y == 1 = x * z | otherwise = g (x * x) ((y - 1) `quot` 2) (x * z)
+ Numeric.Decidable.Units: class Unital r => DecidableUnits r
- Numeric.Domain.Euclidean: class (PID d) => Euclidean d where degree a | isZero a = Nothing | otherwise = Just zero divide a b = let q = a / b in (q, seq q zero) quot a b = fst $ a `divide` b rem a b = snd $ a `divide` b
+ Numeric.Domain.Euclidean: class (PID d) => Euclidean d
- Numeric.Domain.Euclidean: degree :: (Euclidean d, Division d) => d -> Maybe Natural
+ Numeric.Domain.Euclidean: degree :: (Euclidean d, (Division d)) => d -> Maybe Natural
- Numeric.Domain.Euclidean: divide :: (Euclidean d, Division d) => d -> d -> (d, d)
+ Numeric.Domain.Euclidean: divide :: (Euclidean d, (Division d)) => d -> d -> (d, d)
- Numeric.Domain.GCD: class (IntegralDomain d, UnitNormalForm d, DecidableZero d) => GCDDomain d where gcd a b = let (r, _, _) = egcd a b in r reduceFraction a b = let c = gcd a b in (fromJust (a `maybeQuot` c), fromJust (b `maybeQuot` c)) lcm p q = fromJust $ (p * q) `maybeQuot` (gcd p q)
+ Numeric.Domain.GCD: class (IntegralDomain d, UnitNormalForm d, DecidableZero d) => GCDDomain d
- Numeric.Domain.GCD: gcd :: (GCDDomain d, PID d) => d -> d -> d
+ Numeric.Domain.GCD: gcd :: (GCDDomain d, (PID d)) => d -> d -> d
- Numeric.Domain.Integral: class (Domain d, Commutative d) => IntegralDomain d where m `divides` n | isZero m = False | otherwise = isZero (n `rem` m) m `maybeQuot` n | isZero n = Nothing | otherwise = let (q, r) = m `divide` n in if isZero r then Just q else Nothing
+ Numeric.Domain.Integral: class (Domain d, Commutative d) => IntegralDomain d
- Numeric.Domain.Integral: divides :: (IntegralDomain d, Euclidean d) => d -> d -> Bool
+ Numeric.Domain.Integral: divides :: (IntegralDomain d, (Euclidean d)) => d -> d -> Bool
- Numeric.Domain.Integral: maybeQuot :: (IntegralDomain d, Euclidean d) => d -> d -> Maybe d
+ Numeric.Domain.Integral: maybeQuot :: (IntegralDomain d, (Euclidean d)) => d -> d -> Maybe d
- Numeric.Domain.PID: class (UFD d) => PID d where egcd a b = head (euclid a b)
+ Numeric.Domain.PID: class (UFD d) => PID d
- Numeric.Domain.PID: egcd :: (PID d, Euclidean d) => d -> d -> (d, d, d)
+ Numeric.Domain.PID: egcd :: (PID d, (Euclidean d)) => d -> d -> (d, d, d)
- Numeric.Order.Class: class Order a where a <~ b = maybe False (<= EQ) (order a b) a < b = order a b == Just LT a >~ b = b <~ a a > b = order a b == Just GT a ~~ b = order a b == Just EQ a /~ b = order a b /= Just EQ order a b | a <~ b = Just $ if b <~ a then EQ else LT | b <~ a = Just GT | otherwise = Nothing comparable a b = maybe False (const True) (order a b)
+ Numeric.Order.Class: class Order a
- Numeric.Order.LocallyFinite: class Order a => LocallyFiniteOrder a where moebiusInversion x y = case order x y of { Just EQ -> one Just LT -> sumWith (\ z -> if z < y then moebiusInversion x z else zero) $ range x y _ -> zero }
+ Numeric.Order.LocallyFinite: class Order a => LocallyFiniteOrder a
- Numeric.Partial.Group: class PartialMonoid a => PartialGroup a where pnegate = pminus pzero pminus a b = padd a =<< pnegate b psubtract a b = pnegate a >>= (`padd` b)
+ Numeric.Partial.Group: class PartialMonoid a => PartialGroup a
- Numeric.Rig.Class: class (Semiring r, Unital r, Monoidal r) => Rig r where fromNatural n = sinnum n one
+ Numeric.Rig.Class: class (Semiring r, Unital r, Monoidal r) => Rig r
- Numeric.Ring.Class: class (Rig r, Rng r) => Ring r where fromInteger n = times n one
+ Numeric.Ring.Class: class (Rig r, Rng r) => Ring r
Files
- .travis.yml +116/−70
- CHANGELOG.markdown +4/−0
- algebra.cabal +3/−2
- src/Numeric/Ring/Endomorphism.hs +3/−0
.travis.yml view
@@ -1,98 +1,141 @@+# This Travis job script has been generated by a script via+#+# make_travis_yml_2.hs 'algebra.cabal'+#+# For more information, see https://github.com/hvr/multi-ghc-travis+# language: c sudo: false +git:+ submodules: false # whether to recursively clone submodules+ cache: directories:- - $HOME/.cabsnap - $HOME/.cabal/packages+ - $HOME/.cabal/store before_cache: - rm -fv $HOME/.cabal/packages/hackage.haskell.org/build-reports.log- - rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index.tar+ # remove files that are regenerated by 'cabal update'+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index.*+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/*.json+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.cache+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar.idx + - rm -fv $HOME/.cabal/packages/head.hackage+ matrix: include:- - env: CABALVER=1.24 GHCVER=7.4.2- compiler: ": #GHC 7.4.2"- addons: {apt: {packages: [cabal-install-1.24,ghc-7.4.2,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}- - env: CABALVER=1.24 GHCVER=7.6.3- compiler: ": #GHC 7.6.3"- addons: {apt: {packages: [cabal-install-1.24,ghc-7.6.3,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}- - env: CABALVER=1.18 GHCVER=7.8.4- compiler: ": #GHC 7.8.4"- addons: {apt: {packages: [cabal-install-1.18,ghc-7.8.4,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}- - env: CABALVER=1.22 GHCVER=7.10.3- compiler: ": #GHC 7.10.3"- addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.3,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}- - env: CABALVER=1.24 GHCVER=8.0.1- compiler: ": #GHC 8.0.1"- addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.1,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}- - env: CABALVER=1.24 GHCVER=head- compiler: ": #GHC head"- addons: {apt: {packages: [cabal-install-1.24,ghc-head,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}+ - compiler: "ghc-7.4.2"+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-7.4.2], sources: [hvr-ghc]}}+ - compiler: "ghc-7.6.3"+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-7.6.3], sources: [hvr-ghc]}}+ - compiler: "ghc-7.8.4"+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-7.8.4], sources: [hvr-ghc]}}+ - compiler: "ghc-7.10.3"+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-7.10.3], sources: [hvr-ghc]}}+ - compiler: "ghc-8.0.1"+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.0.1], sources: [hvr-ghc]}}+ - compiler: "ghc-8.0.2"+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.0.2], sources: [hvr-ghc]}}+ - compiler: "ghc-8.2.1"+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.2.1], sources: [hvr-ghc]}}+ - compiler: "ghc-8.2.2"+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.2.2], sources: [hvr-ghc]}}+ - compiler: "ghc-8.4.1"+ env: GHCHEAD=true+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.4.1], sources: [hvr-ghc]}}+ - compiler: "ghc-head"+ env: GHCHEAD=true+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-head], sources: [hvr-ghc]}} allow_failures:- - env: CABALVER=1.24 GHCVER=head+ - compiler: "ghc-8.4.1"+ - compiler: "ghc-head" before_install:- - unset CC- - export HAPPYVER=1.19.5- - export ALEXVER=3.1.4- - export PATH=~/.cabal/bin:/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:/opt/happy/$HAPPYVER/bin:/opt/alex/$ALEXVER/bin:$PATH+ - HC=${CC}+ - HCPKG=${HC/ghc/ghc-pkg}+ - unset CC+ - "PATH=/opt/ghc/bin:/opt/ghc-ppa-tools/bin:$PATH" install:- - cabal --version- - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"- - if [ -f $HOME/.cabal/packages/hackage.haskell.org/00-index.tar.gz ];- then- zcat $HOME/.cabal/packages/hackage.haskell.org/00-index.tar.gz >- $HOME/.cabal/packages/hackage.haskell.org/00-index.tar;- fi- - travis_retry cabal update- - "sed -i 's/^jobs:.*$/jobs: 2/' $HOME/.cabal/config"- - cabal install --only-dependencies --enable-tests --enable-benchmarks --dry -v > installplan.txt- - sed -i -e '1,/^Resolving /d' installplan.txt; cat installplan.txt--# check whether current requested install-plan matches cached package-db snapshot- - if diff -u installplan.txt $HOME/.cabsnap/installplan.txt;- then- echo "cabal build-cache HIT";- rm -rfv .ghc;- cp -a $HOME/.cabsnap/ghc $HOME/.ghc;- cp -a $HOME/.cabsnap/lib $HOME/.cabsnap/share $HOME/.cabsnap/bin $HOME/.cabal/;- else- echo "cabal build-cache MISS";- rm -rf $HOME/.cabsnap;- mkdir -p $HOME/.ghc $HOME/.cabal/lib $HOME/.cabal/share $HOME/.cabal/bin;- cabal install --only-dependencies --enable-tests --enable-benchmarks;- if [ "$GHCVER" = "7.10.3" ]; then cabal install Cabal-1.22.4.0; fi;- fi--# snapshot package-db on cache miss- - if [ ! -d $HOME/.cabsnap ];- then- echo "snapshotting package-db to build-cache";- mkdir $HOME/.cabsnap;- cp -a $HOME/.ghc $HOME/.cabsnap/ghc;- cp -a $HOME/.cabal/lib $HOME/.cabal/share $HOME/.cabal/bin installplan.txt $HOME/.cabsnap/;- fi+ - cabal --version+ - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"+ - BENCH=${BENCH---enable-benchmarks}+ - TEST=${TEST---enable-tests}+ - INSTALLED=${INSTALLED-true}+ - GHCHEAD=${GHCHEAD-false}+ - travis_retry cabal update+ - "sed -i.bak 's/^jobs:/-- jobs: 2/' ${HOME}/.cabal/config"+ - rm -fv cabal.project.local+ - "printf 'packages: \".\"\\n' > cabal.project"+ # Overlay Hackage Package Index for GHC HEAD: https://github.com/hvr/head.hackage+ - |+ if $GHCHEAD; then+ echo 'allow-newer: *:base, *:template-haskell' >> cabal.project+ echo 'repository head.hackage' >> cabal.project+ echo ' url: http://head.hackage.haskell.org/' >> cabal.project+ echo ' secure: True' >> cabal.project+ echo ' root-keys: 07c59cb65787dedfaef5bd5f987ceb5f7e5ebf88b904bbd4c5cbdeb2ff71b740' >> cabal.project+ echo ' 2e8555dde16ebd8df076f1a8ef13b8f14c66bad8eafefd7d9e37d0ed711821fb' >> cabal.project+ echo ' 8f79fd2389ab2967354407ec852cbe73f2e8635793ac446d09461ffb99527f6e' >> cabal.project+ echo ' key-threshold: 3' >> cabal.project+ fi+ - cat cabal.project+ - if $GHCHEAD; then cabal new-update head.hackage -v; fi+ - rm -f cabal.project.freeze+ - cabal new-build -w ${HC} ${TEST} ${BENCH} --project-file="cabal.project" --dep -j2 all+ - cabal new-build -w ${HC} --disable-tests --disable-benchmarks --project-file="cabal.project" --dep -j2 all+ - rm -rf "."/.ghc.environment.* "."/dist+ - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX) # Here starts the actual work to be performed for the package under test; # any command which exits with a non-zero exit code causes the build to fail. script:- - cabal configure --enable-tests -v2 # -v2 provides useful information for debugging- - cabal build # this builds all libraries and executables (including tests)- - cabal test- - cabal bench || true # expected result: these will crash- - cabal sdist || true # tests that a source-distribution can be generated+ # test that source-distributions can be generated+ - (cd "." && cabal sdist)+ - mv "."/dist/algebra-*.tar.gz ${DISTDIR}/+ - cd ${DISTDIR} || false+ - find . -maxdepth 1 -name '*.tar.gz' -exec tar -xvf '{}' \;+ - "printf 'packages: algebra-*/*.cabal\\n' > cabal.project"+ # Overlay Hackage Package Index for GHC HEAD: https://github.com/hvr/head.hackage+ - |+ if $GHCHEAD; then+ echo 'allow-newer: *:base, *:template-haskell' >> cabal.project+ echo 'repository head.hackage' >> cabal.project+ echo ' url: http://head.hackage.haskell.org/' >> cabal.project+ echo ' secure: True' >> cabal.project+ echo ' root-keys: 07c59cb65787dedfaef5bd5f987ceb5f7e5ebf88b904bbd4c5cbdeb2ff71b740' >> cabal.project+ echo ' 2e8555dde16ebd8df076f1a8ef13b8f14c66bad8eafefd7d9e37d0ed711821fb' >> cabal.project+ echo ' 8f79fd2389ab2967354407ec852cbe73f2e8635793ac446d09461ffb99527f6e' >> cabal.project+ echo ' key-threshold: 3' >> cabal.project+ fi+ - cat cabal.project+ # this builds all libraries and executables (without tests/benchmarks)+ - cabal new-build -w ${HC} --disable-tests --disable-benchmarks all -# Check that the resulting source distribution can be built & installed.-# If there are no other `.tar.gz` files in `dist`, this can be even simpler:-# `cabal install --force-reinstalls dist/*-*.tar.gz`- - SRC_TGZ=$(cabal info . | awk '{print $2;exit}').tar.gz &&- (cd dist && cabal install --force-reinstalls "$SRC_TGZ")+ # Build with installed constraints for packages in global-db+ - if $INSTALLED; then echo cabal new-build -w ${HC} --disable-tests --disable-benchmarks $(${HCPKG} list --global --simple-output --names-only | sed 's/\([a-zA-Z0-9-]\{1,\}\) */--constraint="\1 installed" /g') all | sh; else echo "Not building with installed constraints"; fi + # build tests & benchmarks+ - cabal new-build -w ${HC} ${TEST} ${BENCH} all+ # cabal new-test FAILS if there is no test-suite at all;+ # so we first test if there is any test-suite by --dry-run,+ # and, if there is any, then we actually run it.+ - |+ if cabal new-test -w ${HC} all --dry-run; then+ cabal new-test -w ${HC} all;+ else+ echo "No test-suite found.";+ fi+ # The same applies for benchmarks, but we've ignored them before switching to new-build...+ - cabal new-bench -w ${HC} all || true + - rm -rf ./dist-newstyle+ notifications: irc: channels:@@ -100,3 +143,6 @@ skip_join: true template: - "\x0313algebra\x03/\x0306%{branch}\x03 \x0314%{commit}\x03 %{build_url} %{message}"++# REGENDATA ["algebra.cabal"]+# EOF
CHANGELOG.markdown view
@@ -1,3 +1,7 @@+4.3.1+-----+* Compatibility with GHC 8.4.x: added `Semigroup (End r)` instance.+ 4.3 --- * Compatibility with GHC 8.0.x
algebra.cabal view
@@ -1,6 +1,6 @@ name: algebra category: Math, Algebra-version: 4.3+version: 4.3.1 license: BSD3 cabal-version: >= 1.6 license-file: LICENSE@@ -14,7 +14,8 @@ description: Constructive abstract algebra build-type: Simple tested-with: GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.4,- GHC == 7.10.3, GHC == 8.0.1+ GHC == 7.10.3, GHC == 8.0.1, GHC == 8.0.2,+ GHC == 8.2.1, GHC == 8.2.2, GHC == 8.4.1 extra-source-files: .ghci .gitignore
src/Numeric/Ring/Endomorphism.hs view
@@ -10,11 +10,14 @@ import Numeric.Algebra import Prelude hiding ((*),(+),(-),negate,subtract) import Data.Proxy+import Data.Semigroup (Semigroup((<>))) -- | The endomorphism ring of an abelian group or the endomorphism semiring of an abelian monoid -- -- http://en.wikipedia.org/wiki/Endomorphism_ring newtype End a = End { appEnd :: a -> a }+instance Semigroup (End r) where+ (End a) <> (End b) = End (a . b) instance Monoid (End r) where mappend (End a) (End b) = End (a . b) mempty = End id