summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Pflug <tobias.pflug@holidaycheck.com>2018-08-08 23:21:02 +0200
committerBen Gamari <ben@smart-cactus.org>2018-08-17 14:51:08 -0400
commitae68f32ada5e97fa76268119294f12ec5c50e73c (patch)
treedbd2b150c8e68c49feb48a1895ec9175fc4c5ba9
parent63b6a1d44849c479d2a7cb59211f5c64d133bc62 (diff)
downloadhaskell-ae68f32ada5e97fa76268119294f12ec5c50e73c.tar.gz
base: rewrite Monoid module docs
-rw-r--r--libraries/base/Data/Monoid.hs39
1 files changed, 37 insertions, 2 deletions
diff --git a/libraries/base/Data/Monoid.hs b/libraries/base/Data/Monoid.hs
index 29b5ddb1a1..2fec717288 100644
--- a/libraries/base/Data/Monoid.hs
+++ b/libraries/base/Data/Monoid.hs
@@ -16,8 +16,43 @@
-- Stability : experimental
-- Portability : portable
--
--- A class for monoids (types with an associative binary operation that
--- has an identity) with various general-purpose instances.
+-- A type @a@ is a 'Monoid' if it provides an associative function ('<>')
+-- that lets you combine any two values of type @a@ into one, and a neutral
+-- element (`mempty`) such that
+--
+-- > a <> mempty == mempty <> a == a
+--
+-- A 'Monoid' is a 'Semigroup' with the added requirement of a neutral element.
+-- Thus any 'Monoid' is a 'Semigroup', but not the other way around.
+--
+-- ==== __Examples__
+--
+-- The 'Sum' monoid is defined by the numerical addition operator and `0` as neutral element:
+--
+-- >>> mempty :: Sum Int
+-- Sum 0
+-- >>> Sum 1 <> Sum 2 <> Sum 3 <> Sum 4 :: Sum Int
+-- Sum {getSum = 10}
+--
+-- We can combine multiple values in a list into a single value using the `mconcat` function.
+-- Note that we have to specify the type here since 'Int' is a monoid under several different
+-- operations:
+--
+-- >>> mconcat [1,2,3,4] :: Sum Int
+-- Sum {getSum = 10}
+-- >>> mconcat [] :: Sum Int
+-- Sum {getSum = 0}
+--
+-- Another valid monoid instance of 'Int' is 'Product' It is defined by multiplication
+-- and `1` as neutral element:
+--
+-- >>> Product 1 <> Product 2 <> Product 3 <> Product 4 :: Product Int
+-- Product {getProduct = 24}
+-- >>> mconcat [1,2,3,4] :: Product Int
+-- Product {getProduct = 24}
+-- >>> mconcat [] :: Product Int
+-- Product {getProduct = 1}
+--
--
-----------------------------------------------------------------------------