monoid-subclasses
Subclasses of Monoid
https://github.com/blamario/monoid-subclasses/
Version on this page: | 1.2.3 |
LTS Haskell 22.39: | 1.2.5.1 |
Stackage Nightly 2024-10-31: | 1.2.5.1 |
Latest on Hackage: | 1.2.5.1 |
monoid-subclasses-1.2.3@sha256:31c5998d3dedb13f11a8f87bd280a8e9ed87f1c1139c6af6655f71ca2c972816,2709
Module documentation for 1.2.3
- Data
- Data.Monoid
- Data.Semigroup
monoid-subclasses
Subclasses of Semigroup and Monoid with a solid theoretical foundation and practical purposes
The monoid-subclasses package has been released on Hackage. The package defines several classes that are richer than semigroups and monoids but less demanding than groups:
-
Reductive provides the operator
</>
which acts as a partial inverse of the semigroup<>
operator. -
Cancellative is a subclass of
Reductive
that provides additional guarantees about the</>
operation result:(a <> b) </> a == Just b (a <> b) </> b == Just a
Every group (i.e., every
Monoid a
with the operationinverse :: a -> a
) is a cancellative monoid wherea </> b = Just (a <> inverse b)
but not everyCancellative
monoid is a group. -
GCDMonoid is a subclass of
Reductive
andMonoid
that provides thegcd
operation for getting the greatest common denominator for two given monoid values. -
LCMMonoid is a subclass of
Reductive
andMonoid
that provides thelcm
operation for getting the least common multiple for two given monoid values. -
Monus provides the
<\>
monus operation. The set difference is one familiar instance of this operation. -
MonoidNull class provides the Boolean
null
operation that checks if the argument monoid ismempty
. -
Factorial and FactorialMonoid classes represent semigroups and monoids that can be split up into irreducible factors.
That’s the theoretical point of view. From the practical point of view, the main purpose of the monoid-subclasses package is similar to that of ListLike - to provide unifying abstractions for various monoidal data types in Haskell, primarily String, ByteString, and Text. All three types are already instances of the Monoid class. While that abstraction is useful for building sequences of data, it doesn’t help with deconstructing them.
That being said, there are two major differences in the goals of ListLike and monoid-subclasses:
- ListLike strives to reproduce the standard Data.List interface, whereas monoid-subclasses builds from deeper theoretical foundations; and
- The monoid-subclasses implementation uses standard Haskell 2010, with the exception of two minor extensions which can be worked around if necessary.
The incremental-parser package can serve as a compact example of a parser library that can be applied to different input types thanks to monoid-subclasses. There is also picoparsec, a fork of attoparsec, and the heavy-duty grammatical-parsers library.
A more thorough description of the library design can be found in the Haskell Symposium 2013 paper Adding Structure to Monoids
Changes
Version 1.2.3
- Add
DistributiveGCDMonoid
andDistributiveLCMMonoid
type class by Jonathan Knowles
Version 1.2.2
- Add
Data.Monoid.LCM
module withLCMMonoid
type class by Jonathan Knowles - Repair links to Hackage within
README.md
by Jonathan Knowles
Version 1.2.1
- Fix for the
Monus
instance forMaybe
by Jonathan Knowles
Version 1.2
- Dropped support for GHC < 8.4
- Depending on new
commutative-semigroups
package - Modified the
instance OverlappingMonoid/Monus Map/IntMap
instances to conform with the class laws - Bumped the
vector
dependency upper bounds
Version 1.1.4
- Canonicalized all
mappend
definitions - Added
deriving (Data, Typeable)
to all data types
Version 1.1.3
- Support for text-2.0 by Bodigrim
Version 1.1.2
- CI tests
- Fallback implementation of
stripCommonSuffix @Text
for GHCjs by Jack Kelly - Fixed documentation bug #31, Factorial laws too strong
Version 1.1.1
- Fixed compilation with GHC 8.0.2
Positioned
doesn’t use a column for zero-width characters any more
Version 1.1
- Added a new TextualMonoid method
toText
for performance - Fixed the calculations of
column
ofLinePositioned
- Changed the
column
ofLinePositioned
to be one-based LinePositioned
now treats FF, CR, and TAB characters as special, in accordance with Haskell language specification.
Version 1.0.1
- Incremented the lower bound of the base dependency
- Fixed Haddock links
Version 1.0
- Fixed issue #24, unlawful LeftReductiveMonoid instance for Map
- Tightened the laws of GCD classes, dropped instances for Sum and Product
- Introduced the
Monus
class - Introduced the
OverlappingGCDMonoid
class - Added the instances of type
Sum Natural
andProduct Natural
- Using the language extensions
FlexibleInstances
andOverlappingInstances
- Removed the linear complexity requirement
- Added and documented less efficient instances
- Moved various GCD classes into the new module
Data.Monoid.GCD
- Added module
Data.Semigroup.Cancellative
withSemigroup
subclasses - Added module
Data.Semigroup.Factorial
withSemigroup
subclasses - Deprecated several
Monoid
subclasses and made them constraint synonyms instead:type CommutativeMonoid m = (Monoid m, Commutative m)
type ReductiveMonoid m = (Monoid m, Reductive m)
type LeftReductiveMonoid m = (Monoid m, LeftReductive m)
type RightReductiveMonoid m = (Monoid m, RightReductive m)
type CancellativeMonoid m = (Monoid m, Cancellative m)
type LeftCancellativeMonoid m = (Monoid m, LeftCancellative m)
type RightCancellativeMonoid m = (Monoid m, RightCancellative m)
Version 0.4.6.1
Bumped the containers dependency upper bounds
Version 0.4.6
Added the Semigroup instances to fix the compilation errors with base-4.11
Version 0.4.4
Fixed boundary condition bugs in ByteStringUTF8 uncovered by a new version of QuickCheck
Version 0.4.3.2
Fixed compilation errors with GHC 7.8.4 and older
Version 0.4.3.1
Bumped the vector dependency upper bounds
Version 0.4.3
- Added instances for 3- and 4-tuples
- Re-implemented Concat as an own data type, dropping Seq
Version 0.4.2.1
- Fixed compilation problems with GHC 8 and containers-0.5.7
- Fixed compilation problems with GHC 8 and containers-0.5.7
- Merge pull request #10 from mgiles: minor typo in FactorialMonoid laws
Version 0.4.2
- Fixed a bug in splitAt implementation for ByteStringUTF8
- Merge pull request #9 from phadej: use newest quickcheck-instances
- Removed the overzealous assertions from ByteStringUTF8
Version 0.4.1.2
Removing accidental reference to Instances.Markup module
Version 0.4.1.1
- Bumped the vector dependency upper bounds
- Removed GHC-prof-options from the cabal file
Version 0.4.1
- Changed the Prelude imports to enable compilation with GHC 7.4
- Added INLINE pragmas
- Added the toString method to TextualMonoid class
- Importing Text.Show.Functions to avoid overlapping instances
- Eliminated the redundant import warnings from GHC 7.10.1
Version 0.4.0.4
- Added -Wall GHC option and eliminated almost all the warnings
- Fixed a bug in the Textual instance of ByteStringUTF8
Version 0.4.0.3
- Excluding the imports of foldMap from Prelude
Version 0.4.0.2
- Added more tests and fixed a bug in Stateful
- Fixed a bug in Positioned.span_
- Optimized the Stateful data type
Version 0.3.6.2
- Added a bunch of pragmas
Version 0.3.6
- Deprecated all the inject functions
- Registered the new Stateful module
Version 0.3.4.1
Accommodating the text-1.0 release
- Introduced the function ByteStringUTF8.decode
- Removed the utf-string dependency
- Replaced the utf-string import by a more efficient UTF-8 encoding
Version 0.3.1
- Added the Data.Monoid.Instances.Concat module and tests
- Added the PositiveMonoid class
- Added the StableFactorialMonoid subclass of FactorialMonoid
- Added more instances for ()
Version 0.3
Added the CommutativeMonoid class at the root of the Cancellative classes
Version 0.2
- Added TextualMonoid instances for Seq Char and Vector Char
- Renamed the FactorialMonoid method map to foldMap in keeping with Foldable
Version 0.1.2
Optimizations of the default Factorial methods and of the ButeStringUTF8 instances
Version 0.1
Initial release