packages feed

groups 0.3.0.0 → 0.4.0.0

raw patch · 2 files changed

+30/−2 lines, 2 files

Files

groups.cabal view
@@ -1,5 +1,5 @@ name:                groups-version:             0.3.0.0+version:             0.4.0.0 synopsis:            Haskell 98 groups description:            Haskell 98 groups. A group is a monoid with invertibility.
src/Data/Group.hs view
@@ -9,37 +9,65 @@ -- @invert a \<> a == mempty@ class Monoid m => Group m where   invert :: m -> m+  -- |@'pow' a n == a \<> a \<> ... \<> a @+  --+  -- @ (n lots of a) @+  --+  -- If n is negative, the result is inverted.+  pow :: Integral x => m -> x -> m+  pow x0 n0 = case compare n0 0 of+    LT -> invert . f x0 $ negate n0+    EQ -> mempty+    GT -> f x0 n0+    where+      f x n +        | even n = f (x `mappend` x) (n `quot` 2)+        | n == 1 = x+        | otherwise = g (x `mappend` x) ((n - 1) `quot` 2) x+      g x n c+        | even n = g (x `mappend` x) (n `quot` 2) c+        | n == 1 = x `mappend` c+        | otherwise = g (x `mappend` x) ((n - 1) `quot` 2) (x `mappend` c)    instance Group () where   invert () = ()+  pow () _ = ()  instance Num a => Group (Sum a) where   invert = Sum . negate . getSum   {-# INLINE invert #-}+  pow (Sum a) b = Sum (a * fromIntegral b)    instance Fractional a => Group (Product a) where   invert = Product . recip . getProduct   {-# INLINE invert #-}+  pow (Product a) b = Product (a ^^ b)  instance Group a => Group (Dual a) where   invert = Dual . invert . getDual   {-# INLINE invert #-}+  pow (Dual a) n = Dual (pow a n)  instance Group b => Group (a -> b) where   invert f = invert . f+  pow f n e = pow (f e) n  instance (Group a, Group b) => Group (a, b) where   invert (a, b) = (invert a, invert b)+  pow (a, b) n = (pow a n, pow b n)    instance (Group a, Group b, Group c) => Group (a, b, c) where   invert (a, b, c) = (invert a, invert b, invert c)+  pow (a, b, c) n = (pow a n, pow b n, pow c n)  instance (Group a, Group b, Group c, Group d) => Group (a, b, c, d) where   invert (a, b, c, d) = (invert a, invert b, invert c, invert d)+  pow (a, b, c, d) n = (pow a n, pow b n, pow c n, pow d n)  instance (Group a, Group b, Group c, Group d, Group e) => Group (a, b, c, d, e) where   invert (a, b, c, d, e) = (invert a, invert b, invert c, invert d, invert e)-  +  pow (a, b, c, d, e) n = (pow a n, pow b n, pow c n, pow d n, pow e n)+ -- |An 'Abelian' group is a 'Group' that follows the rule: --  -- @a \<> b == b \<> a@