-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Semigroup actions, groups, and torsors. -- -- Acts and torsors model types which can be transformed under the action -- of another type. -- -- A prototypical example is affine space, which has an action by -- translation: given any two points in affine space, there is a unique -- translation that brings one to the other. -- -- This can be useful in a library keeping track of time: on top of -- needing to keep track of units, one also needs to distinguish between -- absolute time (time stamps) and relative time (time differences). The -- operations one expects in this situation are: -- --
-- > newtype Seconds = Seconds { getSeconds :: Double }
-- > newtype TimeDelta = TimeDelta { timeDeltaInSeconds :: Seconds }
-- > deriving ( Semigroup, Monoid, Group )
-- > via Sum Double
--
--
--
-- > data MyRecord
-- > = MyRecord
-- > { field1 :: Sum Double
-- > , field2 :: Product Double
-- > , field3 :: Ap [] ( Sum Int, Sum Int )
-- > }
-- > deriving Generic
-- > deriving ( Semigroup, Monoid, Group )
-- > via Generically MyRecord
--
module Data.Group
-- | A Group is a Monoid with inverses:
--
-- inverse g <> g = g <> inverse g = -- mempty
inverse (g <> h) = inverse h <> inverse -- g
-- > newtype Seconds = Seconds { getSeconds :: Double }
-- > deriving ( Act TimeDelta, Torsor TimeDelta )
-- > via TimeDelta
-- > newtype TimeDelta = TimeDelta { timeDeltaInSeconds :: Seconds }
-- > deriving ( Semigroup, Monoid, Group )
-- > via Sum Double
--
module Data.Act
-- | A left act (or left semigroup action) of a semigroup
-- s on x consists of an operation
--
-- -- (•) :: s -> x -> x ---- -- such that: -- --
-- a • ( b • x ) = ( a <> b ) • x ---- -- In case s is also a Monoid, we additionally require: -- --
-- mempty • x = x ---- -- The synonym act = (•) is also provided. class Semigroup s => Act s x -- | Left action of a semigroup. (•) :: Act s x => s -> x -> x -- | Left action of a semigroup. act :: Act s x => s -> x -> x infixr 5 `act` infixr 5 • -- | Transport an act: -- transportAction :: (a -> b) -> (b -> a) -> (g -> b -> b) -> g -> a -> a -- | Trivial act of a semigroup on any type (acting by the identity). newtype Trivial a Trivial :: a -> Trivial a [getTrivial] :: Trivial a -> a -- | A left torsor consists of a free and transitive -- left action of a group on an inhabited type. -- -- This precisely means that for any two terms x, y, -- there exists a unique group element g taking -- x to y, which is denoted y <-- x (or -- x --> y , but the left-pointing arrow is more natural -- when working with left actions). -- -- That is y <-- x is the unique element satisfying: -- --
-- ( y <-- x ) • x = y ---- -- Note the order of composition of <-- and --> -- with respect to <>: -- --
-- ( z <-- y ) <> ( y <-- x ) = z <-- x ---- --
-- ( y --> z ) <> ( x --> y ) = x --> z --class (Group g, Act g x) => Torsor g x -- | Unique group element effecting the given transition (<--) :: Torsor g x => x -> x -> g -- | Unique group element effecting the given transition (-->) :: Torsor g x => x -> x -> g infix 7 --> infix 7 <-- -- | Given -- --
-- data ABCD = A | B | C | D -- deriving stock ( Eq, Generic ) -- deriving anyclass Finitary -- deriving ( Act ( Sum ( Finite 4 ) ), Torsor ( Sum ( Finite 4 ) ) ) -- via Finitely ABCD ---- -- Sizes are checked statically. For instance if we had instead written: -- --
-- deriving ( Act ( Sum ( Finite 3 ) ), Torsor ( Sum ( Finite 3 ) ) ) -- via Finitely ABCD ---- -- we would have gotten the error messages: -- --
-- * No instance for (Act (Sum (Finite 3)) (Finite 4)) -- * No instance for (Torsor (Sum (Finite 3)) (Finite 4)) --newtype Finitely a Finitely :: a -> Finitely a [getFinitely] :: Finitely a -> a instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Data.Act.Finitely a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Act.Finitely a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Act.Finitely a) instance GHC.Generics.Generic1 Data.Act.Finitely instance GHC.Generics.Generic (Data.Act.Finitely a) instance Data.Data.Data a => Data.Data.Data (Data.Act.Finitely a) instance GHC.Read.Read a => GHC.Read.Read (Data.Act.Finitely a) instance GHC.Show.Show a => GHC.Show.Show (Data.Act.Finitely a) instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Data.Act.Trivial a) instance GHC.Enum.Bounded a => GHC.Enum.Bounded (Data.Act.Trivial a) instance GHC.Enum.Enum a => GHC.Enum.Enum (Data.Act.Trivial a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Act.Trivial a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Act.Trivial a) instance GHC.Generics.Generic1 Data.Act.Trivial instance GHC.Generics.Generic (Data.Act.Trivial a) instance Data.Data.Data a => Data.Data.Data (Data.Act.Trivial a) instance GHC.Read.Read a => GHC.Read.Read (Data.Act.Trivial a) instance GHC.Show.Show a => GHC.Show.Show (Data.Act.Trivial a) instance Data.Act.Act Data.Semigroup.Internal.Any GHC.Types.Bool instance Data.Act.Act Data.Semigroup.Internal.All GHC.Types.Bool instance Data.Act.Act s a => Data.Act.Act s (Data.Functor.Const.Const a b) instance (Data.Group.Group g, Data.Act.Torsor g (Data.Finite.Internal.Finite n), Data.Finitary.Finitary a, n GHC.Types.~ Data.Finitary.Cardinality a) => Data.Act.Torsor g (Data.Act.Finitely a) instance Data.Group.Group g => Data.Act.Torsor g g instance GHC.Num.Num a => Data.Act.Torsor (Data.Semigroup.Internal.Sum a) a instance (GHC.Base.Semigroup s, Data.Act.Act s (Data.Finite.Internal.Finite n), Data.Finitary.Finitary a, n GHC.Types.~ Data.Finitary.Cardinality a) => Data.Act.Act s (Data.Act.Finitely a) instance GHC.Base.Semigroup s => Data.Act.Act s (Data.Act.Trivial a) instance GHC.Base.Semigroup s => Data.Act.Act s s instance GHC.Num.Num a => Data.Act.Act (Data.Semigroup.Internal.Sum a) a instance GHC.Num.Num a => Data.Act.Act (Data.Semigroup.Internal.Product a) a instance Data.Act.Act () x instance (Data.Act.Act s1 x1, Data.Act.Act s2 x2) => Data.Act.Act (s1, s2) (x1, x2) instance (Data.Act.Act s1 x1, Data.Act.Act s2 x2, Data.Act.Act s3 x3) => Data.Act.Act (s1, s2, s3) (x1, x2, x3) instance (Data.Act.Act s1 x1, Data.Act.Act s2 x2, Data.Act.Act s3 x3, Data.Act.Act s4 x4) => Data.Act.Act (s1, s2, s3, s4) (x1, x2, x3, x4) instance (Data.Act.Act s1 x1, Data.Act.Act s2 x2, Data.Act.Act s3 x3, Data.Act.Act s4 x4, Data.Act.Act s5 x5) => Data.Act.Act (s1, s2, s3, s4, s5) (x1, x2, x3, x4, x5) instance (Data.Act.Act s x, GHC.Base.Functor f) => Data.Act.Act s (Data.Monoid.Ap f x) instance (GHC.Base.Semigroup s, Data.Act.Act s a) => Data.Act.Act (Data.Semigroup.Internal.Dual s) (Data.Functor.Contravariant.Op b a) instance (GHC.Base.Semigroup s, Data.Act.Act s a, Data.Act.Act t b) => Data.Act.Act (Data.Semigroup.Internal.Dual s, t) (a -> b) instance (Data.Group.Group g, Data.Act.Act g a) => Data.Act.Act g (Data.Semigroup.Internal.Endo a)