Copyright | (C) 2011-2015 Edward Kmett |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | libraries@haskell.org |
Stability | provisional |
Portability | portable |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
In mathematics, a semigroup is an algebraic structure consisting of a set together with an associative binary operation. A semigroup generalizes a monoid in that there might not exist an identity element. It also (originally) generalized a group (a monoid with all inverses) to a type where every element did not have to have an inverse, thus the name semigroup.
The use of (<>)
in this module conflicts with an operator with the same
name that is being exported by Data.Monoid. However, this package
re-exports (most of) the contents of Data.Monoid, so to use semigroups
and monoids in the same package just
import Data.Semigroup
Since: base-4.9.0.0
Synopsis
- class Semigroup a where
- stimesMonoid :: (Integral b, Monoid a) => b -> a -> a
- stimesIdempotent :: Integral b => b -> a -> a
- stimesIdempotentMonoid :: (Integral b, Monoid a) => b -> a -> a
- mtimesDefault :: (Integral b, Monoid a) => b -> a -> a
- newtype Min a = Min {
- getMin :: a
- newtype Max a = Max {
- getMax :: a
- newtype First a = First {
- getFirst :: a
- newtype Last a = Last {
- getLast :: a
- newtype WrappedMonoid m = WrapMonoid {
- unwrapMonoid :: m
- newtype Dual a = Dual {
- getDual :: a
- newtype Endo a = Endo {
- appEndo :: a -> a
- newtype All = All {}
- newtype Any = Any {}
- newtype Sum a = Sum {
- getSum :: a
- newtype Product a = Product {
- getProduct :: a
- newtype Option a = Option {}
- option :: b -> (a -> b) -> Option a -> b
- diff :: Semigroup m => m -> Endo m
- cycle1 :: Semigroup m => m -> m
- data Arg a b = Arg a b
- type ArgMin a b = Min (Arg a b)
- type ArgMax a b = Max (Arg a b)
Documentation
The class of semigroups (types with an associative binary operation).
Instances should satisfy the associativity law:
Since: base-4.9.0.0
(<>) :: a -> a -> a infixr 6 #
An associative operation.
Reduce a non-empty list with <>
The default definition should be sufficient, but this can be overridden for efficiency.
stimes :: Integral b => b -> a -> a #
Repeat a value n
times.
Given that this works on a Semigroup
it is allowed to fail if
you request 0 or fewer repetitions, and the default definition
will do so.
By making this a member of the class, idempotent semigroups
and monoids can upgrade this to execute in O(1) by
picking stimes =
or stimesIdempotent
stimes =
respectively.stimesIdempotentMonoid
Instances
Semigroup Ordering # | Since: base-4.9.0.0 |
Semigroup () # | Since: base-4.9.0.0 |
Semigroup Any # | Since: base-4.9.0.0 |
Semigroup All # | Since: base-4.9.0.0 |
Semigroup Lifetime # | Since: base-4.10.0.0 |
Semigroup Event # | Since: base-4.10.0.0 |
Semigroup Void # | Since: base-4.9.0.0 |
Semigroup [a] # | Since: base-4.9.0.0 |
Semigroup a => Semigroup (Maybe a) # | Since: base-4.9.0.0 |
Semigroup a => Semigroup (IO a) # | Since: base-4.10.0.0 |
Semigroup p => Semigroup (Par1 p) # | Since: base-4.12.0.0 |
Semigroup (NonEmpty a) # | Since: base-4.9.0.0 |
Semigroup a => Semigroup (Down a) # | Since: base-4.11.0.0 |
Num a => Semigroup (Product a) # | Since: base-4.9.0.0 |
Num a => Semigroup (Sum a) # | Since: base-4.9.0.0 |
Semigroup (Endo a) # | Since: base-4.9.0.0 |
Semigroup a => Semigroup (Dual a) # | Since: base-4.9.0.0 |
Semigroup (Last a) # | Since: base-4.9.0.0 |
Semigroup (First a) # | Since: base-4.9.0.0 |
Semigroup a => Semigroup (Identity a) # | Since: base-4.9.0.0 |
Semigroup a => Semigroup (Option a) # | Since: base-4.9.0.0 |
Monoid m => Semigroup (WrappedMonoid m) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup (<>) :: WrappedMonoid m -> WrappedMonoid m -> WrappedMonoid m # sconcat :: NonEmpty (WrappedMonoid m) -> WrappedMonoid m # stimes :: Integral b => b -> WrappedMonoid m -> WrappedMonoid m # | |
Semigroup (Last a) # | Since: base-4.9.0.0 |
Semigroup (First a) # | Since: base-4.9.0.0 |
Ord a => Semigroup (Max a) # | Since: base-4.9.0.0 |
Ord a => Semigroup (Min a) # | Since: base-4.9.0.0 |
Semigroup (Equivalence a) # | |
Defined in Data.Functor.Contravariant (<>) :: Equivalence a -> Equivalence a -> Equivalence a # sconcat :: NonEmpty (Equivalence a) -> Equivalence a # stimes :: Integral b => b -> Equivalence a -> Equivalence a # | |
Semigroup (Comparison a) # | |
Defined in Data.Functor.Contravariant (<>) :: Comparison a -> Comparison a -> Comparison a # sconcat :: NonEmpty (Comparison a) -> Comparison a # stimes :: Integral b => b -> Comparison a -> Comparison a # | |
Semigroup (Predicate a) # | |
Semigroup b => Semigroup (a -> b) # | Since: base-4.9.0.0 |
Semigroup (Either a b) # | Since: base-4.9.0.0 |
Semigroup (V1 p) # | Since: base-4.12.0.0 |
Semigroup (U1 p) # | Since: base-4.12.0.0 |
(Semigroup a, Semigroup b) => Semigroup (a, b) # | Since: base-4.9.0.0 |
Semigroup a => Semigroup (ST s a) # | Since: base-4.11.0.0 |
Semigroup (Proxy s) # | Since: base-4.9.0.0 |
Semigroup a => Semigroup (Op a b) # | |
Semigroup (f p) => Semigroup (Rec1 f p) # | Since: base-4.12.0.0 |
(Semigroup a, Semigroup b, Semigroup c) => Semigroup (a, b, c) # | Since: base-4.9.0.0 |
Alternative f => Semigroup (Alt f a) # | Since: base-4.9.0.0 |
(Applicative f, Semigroup a) => Semigroup (Ap f a) # | Since: base-4.12.0.0 |
Semigroup a => Semigroup (Const a b) # | Since: base-4.9.0.0 |
Semigroup c => Semigroup (K1 i c p) # | Since: base-4.12.0.0 |
(Semigroup (f p), Semigroup (g p)) => Semigroup ((f :*: g) p) # | Since: base-4.12.0.0 |
(Semigroup a, Semigroup b, Semigroup c, Semigroup d) => Semigroup (a, b, c, d) # | Since: base-4.9.0.0 |
Semigroup (f p) => Semigroup (M1 i c f p) # | Since: base-4.12.0.0 |
Semigroup (f (g p)) => Semigroup ((f :.: g) p) # | Since: base-4.12.0.0 |
(Semigroup a, Semigroup b, Semigroup c, Semigroup d, Semigroup e) => Semigroup (a, b, c, d, e) # | Since: base-4.9.0.0 |
stimesMonoid :: (Integral b, Monoid a) => b -> a -> a #
stimesIdempotent :: Integral b => b -> a -> a #
stimesIdempotentMonoid :: (Integral b, Monoid a) => b -> a -> a #
mtimesDefault :: (Integral b, Monoid a) => b -> a -> a #
Semigroups
Instances
Monad Min # | Since: base-4.9.0.0 |
Functor Min # | Since: base-4.9.0.0 |
MonadFix Min # | Since: base-4.9.0.0 |
Defined in Data.Semigroup | |
Applicative Min # | Since: base-4.9.0.0 |
Foldable Min # | Since: base-4.9.0.0 |
Defined in Data.Semigroup fold :: Monoid m => Min m -> m # foldMap :: Monoid m => (a -> m) -> Min a -> m # foldr :: (a -> b -> b) -> b -> Min a -> b # foldr' :: (a -> b -> b) -> b -> Min a -> b # foldl :: (b -> a -> b) -> b -> Min a -> b # foldl' :: (b -> a -> b) -> b -> Min a -> b # foldr1 :: (a -> a -> a) -> Min a -> a # foldl1 :: (a -> a -> a) -> Min a -> a # elem :: Eq a => a -> Min a -> Bool # maximum :: Ord a => Min a -> a # | |
Traversable Min # | Since: base-4.9.0.0 |
Bounded a => Bounded (Min a) # | Since: base-4.9.0.0 |
Enum a => Enum (Min a) # | Since: base-4.9.0.0 |
Eq a => Eq (Min a) # | Since: base-4.9.0.0 |
Data a => Data (Min a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Min a -> c (Min a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Min a) # dataTypeOf :: Min a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Min a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Min a)) # gmapT :: (forall b. Data b => b -> b) -> Min a -> Min a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Min a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Min a -> r # gmapQ :: (forall d. Data d => d -> u) -> Min a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Min a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Min a -> m (Min a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Min a -> m (Min a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Min a -> m (Min a) # | |
Num a => Num (Min a) # | Since: base-4.9.0.0 |
Ord a => Ord (Min a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup | |
Read a => Read (Min a) # | Since: base-4.9.0.0 |
Show a => Show (Min a) # | Since: base-4.9.0.0 |
Generic (Min a) # | |
Ord a => Semigroup (Min a) # | Since: base-4.9.0.0 |
(Ord a, Bounded a) => Monoid (Min a) # | Since: base-4.9.0.0 |
Generic1 Min # | |
type Rep (Min a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup | |
type Rep1 Min # | Since: base-4.9.0.0 |
Defined in Data.Semigroup |
Instances
Monad Max # | Since: base-4.9.0.0 |
Functor Max # | Since: base-4.9.0.0 |
MonadFix Max # | Since: base-4.9.0.0 |
Defined in Data.Semigroup | |
Applicative Max # | Since: base-4.9.0.0 |
Foldable Max # | Since: base-4.9.0.0 |
Defined in Data.Semigroup fold :: Monoid m => Max m -> m # foldMap :: Monoid m => (a -> m) -> Max a -> m # foldr :: (a -> b -> b) -> b -> Max a -> b # foldr' :: (a -> b -> b) -> b -> Max a -> b # foldl :: (b -> a -> b) -> b -> Max a -> b # foldl' :: (b -> a -> b) -> b -> Max a -> b # foldr1 :: (a -> a -> a) -> Max a -> a # foldl1 :: (a -> a -> a) -> Max a -> a # elem :: Eq a => a -> Max a -> Bool # maximum :: Ord a => Max a -> a # | |
Traversable Max # | Since: base-4.9.0.0 |
Bounded a => Bounded (Max a) # | Since: base-4.9.0.0 |
Enum a => Enum (Max a) # | Since: base-4.9.0.0 |
Eq a => Eq (Max a) # | Since: base-4.9.0.0 |
Data a => Data (Max a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Max a -> c (Max a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Max a) # dataTypeOf :: Max a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Max a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Max a)) # gmapT :: (forall b. Data b => b -> b) -> Max a -> Max a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Max a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Max a -> r # gmapQ :: (forall d. Data d => d -> u) -> Max a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Max a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Max a -> m (Max a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Max a -> m (Max a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Max a -> m (Max a) # | |
Num a => Num (Max a) # | Since: base-4.9.0.0 |
Ord a => Ord (Max a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup | |
Read a => Read (Max a) # | Since: base-4.9.0.0 |
Show a => Show (Max a) # | Since: base-4.9.0.0 |
Generic (Max a) # | |
Ord a => Semigroup (Max a) # | Since: base-4.9.0.0 |
(Ord a, Bounded a) => Monoid (Max a) # | Since: base-4.9.0.0 |
Generic1 Max # | |
type Rep (Max a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup | |
type Rep1 Max # | Since: base-4.9.0.0 |
Defined in Data.Semigroup |
Use
to get the behavior of
Option
(First
a)First
from Data.Monoid.
Instances
Monad First # | Since: base-4.9.0.0 |
Functor First # | Since: base-4.9.0.0 |
MonadFix First # | Since: base-4.9.0.0 |
Defined in Data.Semigroup | |
Applicative First # | Since: base-4.9.0.0 |
Foldable First # | Since: base-4.9.0.0 |
Defined in Data.Semigroup fold :: Monoid m => First m -> m # foldMap :: Monoid m => (a -> m) -> First a -> m # foldr :: (a -> b -> b) -> b -> First a -> b # foldr' :: (a -> b -> b) -> b -> First a -> b # foldl :: (b -> a -> b) -> b -> First a -> b # foldl' :: (b -> a -> b) -> b -> First a -> b # foldr1 :: (a -> a -> a) -> First a -> a # foldl1 :: (a -> a -> a) -> First a -> a # elem :: Eq a => a -> First a -> Bool # maximum :: Ord a => First a -> a # minimum :: Ord a => First a -> a # | |
Traversable First # | Since: base-4.9.0.0 |
Bounded a => Bounded (First a) # | Since: base-4.9.0.0 |
Enum a => Enum (First a) # | Since: base-4.9.0.0 |
Eq a => Eq (First a) # | Since: base-4.9.0.0 |
Data a => Data (First a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> First a -> c (First a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (First a) # toConstr :: First a -> Constr # dataTypeOf :: First a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (First a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (First a)) # gmapT :: (forall b. Data b => b -> b) -> First a -> First a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> First a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> First a -> r # gmapQ :: (forall d. Data d => d -> u) -> First a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> First a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> First a -> m (First a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> First a -> m (First a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> First a -> m (First a) # | |
Ord a => Ord (First a) # | Since: base-4.9.0.0 |
Read a => Read (First a) # | Since: base-4.9.0.0 |
Show a => Show (First a) # | Since: base-4.9.0.0 |
Generic (First a) # | |
Semigroup (First a) # | Since: base-4.9.0.0 |
Generic1 First # | |
type Rep (First a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup | |
type Rep1 First # | Since: base-4.9.0.0 |
Defined in Data.Semigroup |
Use
to get the behavior of
Option
(Last
a)Last
from Data.Monoid
Instances
Monad Last # | Since: base-4.9.0.0 |
Functor Last # | Since: base-4.9.0.0 |
MonadFix Last # | Since: base-4.9.0.0 |
Defined in Data.Semigroup | |
Applicative Last # | Since: base-4.9.0.0 |
Foldable Last # | Since: base-4.9.0.0 |
Defined in Data.Semigroup fold :: Monoid m => Last m -> m # foldMap :: Monoid m => (a -> m) -> Last a -> m # foldr :: (a -> b -> b) -> b -> Last a -> b # foldr' :: (a -> b -> b) -> b -> Last a -> b # foldl :: (b -> a -> b) -> b -> Last a -> b # foldl' :: (b -> a -> b) -> b -> Last a -> b # foldr1 :: (a -> a -> a) -> Last a -> a # foldl1 :: (a -> a -> a) -> Last a -> a # elem :: Eq a => a -> Last a -> Bool # maximum :: Ord a => Last a -> a # | |
Traversable Last # | Since: base-4.9.0.0 |
Bounded a => Bounded (Last a) # | Since: base-4.9.0.0 |
Enum a => Enum (Last a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup | |
Eq a => Eq (Last a) # | Since: base-4.9.0.0 |
Data a => Data (Last a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Last a -> c (Last a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Last a) # toConstr :: Last a -> Constr # dataTypeOf :: Last a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Last a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Last a)) # gmapT :: (forall b. Data b => b -> b) -> Last a -> Last a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Last a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Last a -> r # gmapQ :: (forall d. Data d => d -> u) -> Last a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Last a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Last a -> m (Last a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Last a -> m (Last a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Last a -> m (Last a) # | |
Ord a => Ord (Last a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup | |
Read a => Read (Last a) # | Since: base-4.9.0.0 |
Show a => Show (Last a) # | Since: base-4.9.0.0 |
Generic (Last a) # | |
Semigroup (Last a) # | Since: base-4.9.0.0 |
Generic1 Last # | |
type Rep (Last a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup | |
type Rep1 Last # | Since: base-4.9.0.0 |
Defined in Data.Semigroup |
newtype WrappedMonoid m #
Provide a Semigroup for an arbitrary Monoid.
NOTE: This is not needed anymore since Semigroup
became a superclass of
Monoid
in base-4.11 and this newtype be deprecated at some point in the future.
WrapMonoid | |
|
Instances
Re-exported monoids from Data.Monoid
The dual of a Monoid
, obtained by swapping the arguments of mappend
.
>>>
getDual (mappend (Dual "Hello") (Dual "World"))
"WorldHello"
Instances
Monad Dual # | Since: base-4.8.0.0 |
Functor Dual # | Since: base-4.8.0.0 |
MonadFix Dual # | Since: base-4.8.0.0 |
Defined in Control.Monad.Fix | |
Applicative Dual # | Since: base-4.8.0.0 |
Foldable Dual # | Since: base-4.8.0.0 |
Defined in Data.Foldable fold :: Monoid m => Dual m -> m # foldMap :: Monoid m => (a -> m) -> Dual a -> m # foldr :: (a -> b -> b) -> b -> Dual a -> b # foldr' :: (a -> b -> b) -> b -> Dual a -> b # foldl :: (b -> a -> b) -> b -> Dual a -> b # foldl' :: (b -> a -> b) -> b -> Dual a -> b # foldr1 :: (a -> a -> a) -> Dual a -> a # foldl1 :: (a -> a -> a) -> Dual a -> a # elem :: Eq a => a -> Dual a -> Bool # maximum :: Ord a => Dual a -> a # | |
Traversable Dual # | Since: base-4.8.0.0 |
MonadZip Dual # | Since: base-4.8.0.0 |
Bounded a => Bounded (Dual a) # | Since: base-2.1 |
Eq a => Eq (Dual a) # | Since: base-2.1 |
Data a => Data (Dual a) # | Since: base-4.8.0.0 |
Defined in Data.Data gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Dual a -> c (Dual a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Dual a) # toConstr :: Dual a -> Constr # dataTypeOf :: Dual a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Dual a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Dual a)) # gmapT :: (forall b. Data b => b -> b) -> Dual a -> Dual a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Dual a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Dual a -> r # gmapQ :: (forall d. Data d => d -> u) -> Dual a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Dual a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Dual a -> m (Dual a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Dual a -> m (Dual a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Dual a -> m (Dual a) # | |
Ord a => Ord (Dual a) # | Since: base-2.1 |
Defined in Data.Semigroup.Internal | |
Read a => Read (Dual a) # | Since: base-2.1 |
Show a => Show (Dual a) # | Since: base-2.1 |
Generic (Dual a) # | |
Semigroup a => Semigroup (Dual a) # | Since: base-4.9.0.0 |
Monoid a => Monoid (Dual a) # | Since: base-2.1 |
Generic1 Dual # | |
type Rep (Dual a) # | Since: base-4.7.0.0 |
Defined in Data.Semigroup.Internal | |
type Rep1 Dual # | Since: base-4.7.0.0 |
Defined in Data.Semigroup.Internal |
The monoid of endomorphisms under composition.
>>>
let computation = Endo ("Hello, " ++) <> Endo (++ "!")
>>>
appEndo computation "Haskell"
"Hello, Haskell!"
Boolean monoid under conjunction (&&
).
>>>
getAll (All True <> mempty <> All False)
False
>>>
getAll (mconcat (map (\x -> All (even x)) [2,4,6,7,8]))
False
Instances
Bounded All # | Since: base-2.1 |
Eq All # | Since: base-2.1 |
Data All # | Since: base-4.8.0.0 |
Defined in Data.Data gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> All -> c All # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c All # dataTypeOf :: All -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c All) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c All) # gmapT :: (forall b. Data b => b -> b) -> All -> All # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> All -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> All -> r # gmapQ :: (forall d. Data d => d -> u) -> All -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> All -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> All -> m All # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> All -> m All # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> All -> m All # | |
Ord All # | Since: base-2.1 |
Read All # | Since: base-2.1 |
Show All # | Since: base-2.1 |
Generic All # | |
Semigroup All # | Since: base-4.9.0.0 |
Monoid All # | Since: base-2.1 |
type Rep All # | Since: base-4.7.0.0 |
Defined in Data.Semigroup.Internal |
Boolean monoid under disjunction (||
).
>>>
getAny (Any True <> mempty <> Any False)
True
>>>
getAny (mconcat (map (\x -> Any (even x)) [2,4,6,7,8]))
True
Instances
Bounded Any # | Since: base-2.1 |
Eq Any # | Since: base-2.1 |
Data Any # | Since: base-4.8.0.0 |
Defined in Data.Data gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Any -> c Any # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Any # dataTypeOf :: Any -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c Any) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Any) # gmapT :: (forall b. Data b => b -> b) -> Any -> Any # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Any -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Any -> r # gmapQ :: (forall d. Data d => d -> u) -> Any -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Any -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Any -> m Any # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Any -> m Any # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Any -> m Any # | |
Ord Any # | Since: base-2.1 |
Read Any # | Since: base-2.1 |
Show Any # | Since: base-2.1 |
Generic Any # | |
Semigroup Any # | Since: base-4.9.0.0 |
Monoid Any # | Since: base-2.1 |
type Rep Any # | Since: base-4.7.0.0 |
Defined in Data.Semigroup.Internal |
Monoid under addition.
>>>
getSum (Sum 1 <> Sum 2 <> mempty)
3
Instances
Monad Sum # | Since: base-4.8.0.0 |
Functor Sum # | Since: base-4.8.0.0 |
MonadFix Sum # | Since: base-4.8.0.0 |
Defined in Control.Monad.Fix | |
Applicative Sum # | Since: base-4.8.0.0 |
Foldable Sum # | Since: base-4.8.0.0 |
Defined in Data.Foldable fold :: Monoid m => Sum m -> m # foldMap :: Monoid m => (a -> m) -> Sum a -> m # foldr :: (a -> b -> b) -> b -> Sum a -> b # foldr' :: (a -> b -> b) -> b -> Sum a -> b # foldl :: (b -> a -> b) -> b -> Sum a -> b # foldl' :: (b -> a -> b) -> b -> Sum a -> b # foldr1 :: (a -> a -> a) -> Sum a -> a # foldl1 :: (a -> a -> a) -> Sum a -> a # elem :: Eq a => a -> Sum a -> Bool # maximum :: Ord a => Sum a -> a # | |
Traversable Sum # | Since: base-4.8.0.0 |
MonadZip Sum # | Since: base-4.8.0.0 |
Bounded a => Bounded (Sum a) # | Since: base-2.1 |
Eq a => Eq (Sum a) # | Since: base-2.1 |
Data a => Data (Sum a) # | Since: base-4.8.0.0 |
Defined in Data.Data gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Sum a -> c (Sum a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Sum a) # dataTypeOf :: Sum a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Sum a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Sum a)) # gmapT :: (forall b. Data b => b -> b) -> Sum a -> Sum a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Sum a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Sum a -> r # gmapQ :: (forall d. Data d => d -> u) -> Sum a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Sum a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Sum a -> m (Sum a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Sum a -> m (Sum a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Sum a -> m (Sum a) # | |
Num a => Num (Sum a) # | Since: base-4.7.0.0 |
Ord a => Ord (Sum a) # | Since: base-2.1 |
Defined in Data.Semigroup.Internal | |
Read a => Read (Sum a) # | Since: base-2.1 |
Show a => Show (Sum a) # | Since: base-2.1 |
Generic (Sum a) # | |
Num a => Semigroup (Sum a) # | Since: base-4.9.0.0 |
Num a => Monoid (Sum a) # | Since: base-2.1 |
Generic1 Sum # | |
type Rep (Sum a) # | Since: base-4.7.0.0 |
Defined in Data.Semigroup.Internal | |
type Rep1 Sum # | Since: base-4.7.0.0 |
Defined in Data.Semigroup.Internal |
Monoid under multiplication.
>>>
getProduct (Product 3 <> Product 4 <> mempty)
12
Product | |
|
Instances
Monad Product # | Since: base-4.8.0.0 |
Functor Product # | Since: base-4.8.0.0 |
MonadFix Product # | Since: base-4.8.0.0 |
Defined in Control.Monad.Fix | |
Applicative Product # | Since: base-4.8.0.0 |
Foldable Product # | Since: base-4.8.0.0 |
Defined in Data.Foldable fold :: Monoid m => Product m -> m # foldMap :: Monoid m => (a -> m) -> Product a -> m # foldr :: (a -> b -> b) -> b -> Product a -> b # foldr' :: (a -> b -> b) -> b -> Product a -> b # foldl :: (b -> a -> b) -> b -> Product a -> b # foldl' :: (b -> a -> b) -> b -> Product a -> b # foldr1 :: (a -> a -> a) -> Product a -> a # foldl1 :: (a -> a -> a) -> Product a -> a # elem :: Eq a => a -> Product a -> Bool # maximum :: Ord a => Product a -> a # minimum :: Ord a => Product a -> a # | |
Traversable Product # | Since: base-4.8.0.0 |
MonadZip Product # | Since: base-4.8.0.0 |
Bounded a => Bounded (Product a) # | Since: base-2.1 |
Eq a => Eq (Product a) # | Since: base-2.1 |
Data a => Data (Product a) # | Since: base-4.8.0.0 |
Defined in Data.Data gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Product a -> c (Product a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Product a) # toConstr :: Product a -> Constr # dataTypeOf :: Product a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Product a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Product a)) # gmapT :: (forall b. Data b => b -> b) -> Product a -> Product a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Product a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Product a -> r # gmapQ :: (forall d. Data d => d -> u) -> Product a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Product a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Product a -> m (Product a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Product a -> m (Product a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Product a -> m (Product a) # | |
Num a => Num (Product a) # | Since: base-4.7.0.0 |
Defined in Data.Semigroup.Internal | |
Ord a => Ord (Product a) # | Since: base-2.1 |
Defined in Data.Semigroup.Internal | |
Read a => Read (Product a) # | Since: base-2.1 |
Show a => Show (Product a) # | Since: base-2.1 |
Generic (Product a) # | |
Num a => Semigroup (Product a) # | Since: base-4.9.0.0 |
Num a => Monoid (Product a) # | Since: base-2.1 |
Generic1 Product # | |
type Rep (Product a) # | Since: base-4.7.0.0 |
Defined in Data.Semigroup.Internal | |
type Rep1 Product # | Since: base-4.7.0.0 |
Defined in Data.Semigroup.Internal |
A better monoid for Maybe
Option
is effectively Maybe
with a better instance of
Monoid
, built off of an underlying Semigroup
instead of an
underlying Monoid
.
Ideally, this type would not exist at all and we would just fix the
Monoid
instance of Maybe
.
In GHC 8.4 and higher, the Monoid
instance for Maybe
has been
corrected to lift a Semigroup
instance instead of a Monoid
instance. Consequently, this type is no longer useful. It will be
marked deprecated in GHC 8.8 and removed in GHC 8.10.
Instances
Monad Option # | Since: base-4.9.0.0 |
Functor Option # | Since: base-4.9.0.0 |
MonadFix Option # | Since: base-4.9.0.0 |
Defined in Data.Semigroup | |
Applicative Option # | Since: base-4.9.0.0 |
Foldable Option # | Since: base-4.9.0.0 |
Defined in Data.Semigroup fold :: Monoid m => Option m -> m # foldMap :: Monoid m => (a -> m) -> Option a -> m # foldr :: (a -> b -> b) -> b -> Option a -> b # foldr' :: (a -> b -> b) -> b -> Option a -> b # foldl :: (b -> a -> b) -> b -> Option a -> b # foldl' :: (b -> a -> b) -> b -> Option a -> b # foldr1 :: (a -> a -> a) -> Option a -> a # foldl1 :: (a -> a -> a) -> Option a -> a # elem :: Eq a => a -> Option a -> Bool # maximum :: Ord a => Option a -> a # minimum :: Ord a => Option a -> a # | |
Traversable Option # | Since: base-4.9.0.0 |
MonadPlus Option # | Since: base-4.9.0.0 |
Alternative Option # | Since: base-4.9.0.0 |
Eq a => Eq (Option a) # | Since: base-4.9.0.0 |
Data a => Data (Option a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Option a -> c (Option a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Option a) # toConstr :: Option a -> Constr # dataTypeOf :: Option a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Option a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Option a)) # gmapT :: (forall b. Data b => b -> b) -> Option a -> Option a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Option a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Option a -> r # gmapQ :: (forall d. Data d => d -> u) -> Option a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Option a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Option a -> m (Option a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Option a -> m (Option a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Option a -> m (Option a) # | |
Ord a => Ord (Option a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup | |
Read a => Read (Option a) # | Since: base-4.9.0.0 |
Show a => Show (Option a) # | Since: base-4.9.0.0 |
Generic (Option a) # | |
Semigroup a => Semigroup (Option a) # | Since: base-4.9.0.0 |
Semigroup a => Monoid (Option a) # | Since: base-4.9.0.0 |
Generic1 Option # | |
type Rep (Option a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup | |
type Rep1 Option # | Since: base-4.9.0.0 |
Defined in Data.Semigroup |
Difference lists of a semigroup
ArgMin, ArgMax
Arg
isn't itself a Semigroup
in its own right, but it can be
placed inside Min
and Max
to compute an arg min or arg max.
Arg a b |
Instances
Bifunctor Arg # | Since: base-4.9.0.0 |
Bifoldable Arg # | Since: base-4.10.0.0 |
Bitraversable Arg # | Since: base-4.10.0.0 |
Defined in Data.Semigroup bitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> Arg a b -> f (Arg c d) # | |
Functor (Arg a) # | Since: base-4.9.0.0 |
Foldable (Arg a) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup fold :: Monoid m => Arg a m -> m # foldMap :: Monoid m => (a0 -> m) -> Arg a a0 -> m # foldr :: (a0 -> b -> b) -> b -> Arg a a0 -> b # foldr' :: (a0 -> b -> b) -> b -> Arg a a0 -> b # foldl :: (b -> a0 -> b) -> b -> Arg a a0 -> b # foldl' :: (b -> a0 -> b) -> b -> Arg a a0 -> b # foldr1 :: (a0 -> a0 -> a0) -> Arg a a0 -> a0 # foldl1 :: (a0 -> a0 -> a0) -> Arg a a0 -> a0 # elem :: Eq a0 => a0 -> Arg a a0 -> Bool # maximum :: Ord a0 => Arg a a0 -> a0 # minimum :: Ord a0 => Arg a a0 -> a0 # | |
Traversable (Arg a) # | Since: base-4.9.0.0 |
Generic1 (Arg a :: Type -> Type) # | |
Eq a => Eq (Arg a b) # | Since: base-4.9.0.0 |
(Data a, Data b) => Data (Arg a b) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup gfoldl :: (forall d b0. Data d => c (d -> b0) -> d -> c b0) -> (forall g. g -> c g) -> Arg a b -> c (Arg a b) # gunfold :: (forall b0 r. Data b0 => c (b0 -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Arg a b) # toConstr :: Arg a b -> Constr # dataTypeOf :: Arg a b -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Arg a b)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Arg a b)) # gmapT :: (forall b0. Data b0 => b0 -> b0) -> Arg a b -> Arg a b # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Arg a b -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Arg a b -> r # gmapQ :: (forall d. Data d => d -> u) -> Arg a b -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Arg a b -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Arg a b -> m (Arg a b) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Arg a b -> m (Arg a b) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Arg a b -> m (Arg a b) # | |
Ord a => Ord (Arg a b) # | Since: base-4.9.0.0 |
(Read a, Read b) => Read (Arg a b) # | Since: base-4.9.0.0 |
(Show a, Show b) => Show (Arg a b) # | Since: base-4.9.0.0 |
Generic (Arg a b) # | |
type Rep1 (Arg a :: Type -> Type) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup type Rep1 (Arg a :: Type -> Type) = D1 (MetaData "Arg" "Data.Semigroup" "base" False) (C1 (MetaCons "Arg" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 a) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) Par1)) | |
type Rep (Arg a b) # | Since: base-4.9.0.0 |
Defined in Data.Semigroup type Rep (Arg a b) = D1 (MetaData "Arg" "Data.Semigroup" "base" False) (C1 (MetaCons "Arg" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 a) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 b))) |