-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | A Difference Monoid, to add subtraction to arbitrary monoids. Please -- see the README on Github at -- https://github.com/oisdk/difference-monoid#readme @package difference-monoid @version 0.1.0.0 module Data.Monoid.Odd -- | A monoid over XOR. newtype Odd Odd :: Bool -> Odd [getOdd] :: Odd -> Bool instance Control.DeepSeq.NFData Data.Monoid.Odd.Odd instance Foreign.Storable.Storable Data.Monoid.Odd.Odd instance Data.Bits.Bits Data.Monoid.Odd.Odd instance Data.Bits.FiniteBits Data.Monoid.Odd.Odd instance GHC.Generics.Generic Data.Monoid.Odd.Odd instance GHC.Arr.Ix Data.Monoid.Odd.Odd instance GHC.Read.Read Data.Monoid.Odd.Odd instance Data.Data.Data Data.Monoid.Odd.Odd instance GHC.Enum.Enum Data.Monoid.Odd.Odd instance GHC.Enum.Bounded Data.Monoid.Odd.Odd instance GHC.Show.Show Data.Monoid.Odd.Odd instance GHC.Classes.Ord Data.Monoid.Odd.Odd instance GHC.Classes.Eq Data.Monoid.Odd.Odd instance Data.Semigroup.Semigroup Data.Monoid.Odd.Odd instance GHC.Base.Monoid Data.Monoid.Odd.Odd instance Data.Group.Group Data.Monoid.Odd.Odd module Data.Monoid.Diff.Internal -- | The Difference Monoid. data Diff a (:-:) :: !a -> !a -> Diff a -- | Lift a monoid into the difference monoid. -- --
-- >>> diff (Sum 1)
-- Sum {getSum = 1} :-: Sum {getSum = 0}
--
diff :: Monoid a => a -> Diff a
-- | The inverse of diff.
--
-- -- retract . diff = id --retract :: Group a => Diff a -> a -- | A group homomorphism given a monoid homomorphism. foldDiff :: Group b => (a -> b) -> Diff a -> b -- | Given a "normalizing" function, try simplify the representation. -- -- For instance, one such normalizing function may be to take the numeric -- difference of two types: -- --
-- >>> let sumNorm x y = if x >= y then (x - y, 0) else (0, y - x)
--
-- >>> normalize sumNorm ((foldMap (diff.Sum) [1..10]) <> (invert (foldMap (diff.Sum) [1..5])))
-- Sum {getSum = 40} :-: Sum {getSum = 0}
--
normalize :: (a -> a -> (a, a)) -> Diff a -> Diff a
-- | Interpret the difference using a subtraction function.
runDiff :: (a -> a -> b) -> Diff a -> b
-- | The Parity Comonad. It is left-adjunct to Diff.
newtype Parity a
Parity :: (Odd, a) -> Parity a
[runParity] :: Parity a -> (Odd, a)
instance Control.Comonad.Env.Class.ComonadEnv Data.Monoid.Odd.Odd Data.Monoid.Diff.Internal.Parity
instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Data.Monoid.Diff.Internal.Parity a)
instance GHC.Base.Monoid a => GHC.Base.Monoid (Data.Monoid.Diff.Internal.Parity a)
instance Data.Semigroup.Semigroup a => Data.Semigroup.Semigroup (Data.Monoid.Diff.Internal.Parity a)
instance GHC.Arr.Ix a => GHC.Arr.Ix (Data.Monoid.Diff.Internal.Parity a)
instance GHC.Enum.Bounded a => GHC.Enum.Bounded (Data.Monoid.Diff.Internal.Parity a)
instance GHC.Read.Read a => GHC.Read.Read (Data.Monoid.Diff.Internal.Parity a)
instance GHC.Show.Show a => GHC.Show.Show (Data.Monoid.Diff.Internal.Parity a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Monoid.Diff.Internal.Parity a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Monoid.Diff.Internal.Parity a)
instance Control.Comonad.ComonadApply Data.Monoid.Diff.Internal.Parity
instance Control.Comonad.Comonad Data.Monoid.Diff.Internal.Parity
instance Data.Functor.Extend.Extend Data.Monoid.Diff.Internal.Parity
instance Data.Functor.Bind.Class.Bind Data.Monoid.Diff.Internal.Parity
instance Data.Functor.Bind.Class.Apply Data.Monoid.Diff.Internal.Parity
instance GHC.Base.Monad Data.Monoid.Diff.Internal.Parity
instance GHC.Base.Applicative Data.Monoid.Diff.Internal.Parity
instance Data.Semigroup.Foldable.Class.Foldable1 Data.Monoid.Diff.Internal.Parity
instance Data.Traversable.Traversable Data.Monoid.Diff.Internal.Parity
instance Data.Foldable.Foldable Data.Monoid.Diff.Internal.Parity
instance GHC.Base.Functor Data.Monoid.Diff.Internal.Parity
instance GHC.Generics.Generic1 Data.Monoid.Diff.Internal.Diff
instance GHC.Generics.Generic (Data.Monoid.Diff.Internal.Diff a)
instance Data.Data.Data a => Data.Data.Data (Data.Monoid.Diff.Internal.Diff a)
instance GHC.Read.Read a => GHC.Read.Read (Data.Monoid.Diff.Internal.Diff a)
instance GHC.Show.Show a => GHC.Show.Show (Data.Monoid.Diff.Internal.Diff a)
instance Data.Semigroup.Traversable.Class.Traversable1 Data.Monoid.Diff.Internal.Parity
instance Control.Monad.Fix.MonadFix Data.Monoid.Diff.Internal.Parity
instance Data.Functor.Adjunction.Adjunction Data.Monoid.Diff.Internal.Parity Data.Monoid.Diff.Internal.Diff
instance GHC.Base.Functor Data.Monoid.Diff.Internal.Diff
instance Data.Foldable.Foldable Data.Monoid.Diff.Internal.Diff
instance Data.Traversable.Traversable Data.Monoid.Diff.Internal.Diff
instance GHC.Base.Applicative Data.Monoid.Diff.Internal.Diff
instance GHC.Base.Monad Data.Monoid.Diff.Internal.Diff
instance Data.Functor.Bind.Class.Bind Data.Monoid.Diff.Internal.Diff
instance Data.Semigroup.Semigroup a => Data.Semigroup.Semigroup (Data.Monoid.Diff.Internal.Diff a)
instance GHC.Base.Monoid a => GHC.Base.Monoid (Data.Monoid.Diff.Internal.Diff a)
instance GHC.Base.Monoid a => Data.Group.Group (Data.Monoid.Diff.Internal.Diff a)
instance (GHC.Classes.Eq a, Data.Semigroup.Semigroup a) => GHC.Classes.Eq (Data.Monoid.Diff.Internal.Diff a)
instance (GHC.Classes.Ord a, Data.Semigroup.Semigroup a) => GHC.Classes.Ord (Data.Monoid.Diff.Internal.Diff a)
instance Control.Monad.Fix.MonadFix Data.Monoid.Diff.Internal.Diff
instance Control.Monad.Zip.MonadZip Data.Monoid.Diff.Internal.Diff
instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Data.Monoid.Diff.Internal.Diff a)
instance Data.Distributive.Distributive Data.Monoid.Diff.Internal.Diff
instance Data.Functor.Rep.Representable Data.Monoid.Diff.Internal.Diff
instance Data.Semigroup.Foldable.Class.Foldable1 Data.Monoid.Diff.Internal.Diff
instance Data.Semigroup.Traversable.Class.Traversable1 Data.Monoid.Diff.Internal.Diff
instance Data.Functor.Bind.Class.Apply Data.Monoid.Diff.Internal.Diff
instance Control.Comonad.Comonad Data.Monoid.Diff.Internal.Diff
instance Control.Comonad.ComonadApply Data.Monoid.Diff.Internal.Diff
instance GHC.Enum.Bounded a => GHC.Enum.Bounded (Data.Monoid.Diff.Internal.Diff a)
instance Data.Functor.Classes.Show1 Data.Monoid.Diff.Internal.Diff
instance Data.Functor.Classes.Read1 Data.Monoid.Diff.Internal.Diff
instance Data.Functor.Extend.Extend Data.Monoid.Diff.Internal.Diff
-- | This module provides the Difference Monoid, which adds subtraction to
-- arbitrary monoids.
--
-- This has a number of uses:
--
-- >>> (1 :-: 2) <> (3 :-: 4)
-- :: Diff (Product Int) Product {getProduct = 3} :-: Product {getProduct
-- = 8} >>> runDiff (-) (diff 2
-- <> diff 3 <> invert (diff 4)) :: Sum Natural Sum {getSum =
-- 1} This will let you work with nonnegative types, where you need
-- some form of subtraction (for, e.g., differences, hence the name), and
-- you only want to check for underflow once.>>> import Data.Function (on) >>> let -- avg = runDiff ((%) `on` getProduct.getSum) . foldMap (fmap Sum . diff -- . Product) >>> avg [1,4,3,2,5] 3 % 1
-- fromList [1] <> fromList [1,2] = fromList [1] <> fromList [2] ---- -- This type is known formally as the Grothendieck group. module Data.Monoid.Diff -- | The Difference Monoid. data Diff a (:-:) :: !a -> !a -> Diff a -- | Lift a monoid into the difference monoid. -- --
-- >>> diff (Sum 1)
-- Sum {getSum = 1} :-: Sum {getSum = 0}
--
diff :: Monoid a => a -> Diff a
-- | The inverse of diff.
--
-- -- retract . diff = id --retract :: Group a => Diff a -> a -- | A group homomorphism given a monoid homomorphism. foldDiff :: Group b => (a -> b) -> Diff a -> b -- | Interpret the difference using a subtraction function. runDiff :: (a -> a -> b) -> Diff a -> b -- | Given a "normalizing" function, try simplify the representation. -- -- For instance, one such normalizing function may be to take the numeric -- difference of two types: -- --
-- >>> let sumNorm x y = if x >= y then (x - y, 0) else (0, y - x)
--
-- >>> normalize sumNorm ((foldMap (diff.Sum) [1..10]) <> (invert (foldMap (diff.Sum) [1..5])))
-- Sum {getSum = 40} :-: Sum {getSum = 0}
--
normalize :: (a -> a -> (a, a)) -> Diff a -> Diff a
-- | A Group is a Monoid plus a function, invert, such
-- that:
--
-- -- a <> invert a == mempty ---- --
-- invert a <> a == mempty --class Monoid m => Group m invert :: Group m => m -> m -- |
-- pow a n == a <> a <> ... <> a ---- --
-- (n lots of a) ---- -- If n is negative, the result is inverted. pow :: (Group m, Integral x) => m -> x -> m module Control.Monad.Parity -- | The Parity Comonad. It is left-adjunct to Diff. newtype Parity a Parity :: (Odd, a) -> Parity a [runParity] :: Parity a -> (Odd, a)