Safe Haskell | None |
---|---|
Language | Haskell98 |
Data.Semiring
Description
A class for semirings (types with two binary operations, one commutative and one associative, and two respective identities), with various general-purpose instances.
Synopsis
- class Semiring a where
- (+) :: Semiring a => a -> a -> a
- (*) :: Semiring a => a -> a -> a
- (^) :: (Semiring a, Integral b) => a -> b -> a
- foldMapP :: (Foldable t, Semiring s) => (a -> s) -> t a -> s
- foldMapT :: (Foldable t, Semiring s) => (a -> s) -> t a -> s
- sum :: (Foldable t, Semiring a) => t a -> a
- product :: (Foldable t, Semiring a) => t a -> a
- sum' :: (Foldable t, Semiring a) => t a -> a
- product' :: (Foldable t, Semiring a) => t a -> a
- isZero :: (Eq a, Semiring a) => a -> Bool
- isOne :: (Eq a, Semiring a) => a -> Bool
- newtype Add a = Add {
- getAdd :: a
- newtype Mul a = Mul {
- getMul :: a
- newtype WrappedNum a = WrapNum {
- unwrapNum :: a
- newtype Mod2 = Mod2 {}
- newtype IntSetOf a = IntSetOf {}
- newtype IntMapOf k v = IntMapOf {}
- class Semiring a => Ring a where
- negate :: a -> a
- fromInteger :: Ring a => Integer -> a
- fromIntegral :: (Integral a, Ring b) => a -> b
- minus :: Ring a => a -> a -> a
- (-) :: Ring a => a -> a -> a
Semiring typeclass
The class of semirings (types with two binary
operations and two respective identities). One
can think of a semiring as two monoids of the same
underlying type, with the first being commutative.
In the documentation, you will often see the first
monoid being referred to as additive
, and the second
monoid being referred to as multiplicative
, a typical
convention when talking about semirings.
For any type R with a Num
instance, the additive monoid is (R, +
, 0)
and the multiplicative monoid is (R, *
, 1).
For Bool
, the additive monoid is (Bool
, ||
, False
)
and the multiplicative monoid is (Bool
, &&
, True
).
Instances should satisfy the following laws:
- additive left identity
zero
+
x = x- additive right identity
x
+
zero
= x- additive associativity
x
+
(y+
z) = (x+
y)+
z- additive commutativity
x
+
y = y+
x- multiplicative left identity
one
*
x = x- multiplicative right identity
x
*
one
= x- multiplicative associativity
x
*
(y*
z) = (x*
y)*
z- left-distributivity of
*
over+
x
*
(y+
z) = (x*
y)+
(x*
z)- right-distributivity of
*
over+
(x
+
y)*
z = (x*
z)+
(y*
z)- annihilation
zero
*
x = x*
zero
=zero
Minimal complete definition
plus, times, (zero, one | fromNatural)
Methods
Arguments
:: a | |
-> a | |
-> a | Commutative Operation |
Arguments
:: a | Commutative Unit |
Arguments
:: a | |
-> a | |
-> a | Associative Operation |
Arguments
:: a | Associative Unit |
Arguments
:: Natural | |
-> a | Homomorphism of additive semigroups |
Instances
(^) :: (Semiring a, Integral b) => a -> b -> a infixr 8 #
Raise a number to a non-negative integral power.
If the power is negative, this will call error
.
foldMapP :: (Foldable t, Semiring s) => (a -> s) -> t a -> s #
Map each element of the structure to a semiring, and combine the results
using plus
.
foldMapT :: (Foldable t, Semiring s) => (a -> s) -> t a -> s #
Map each element of the structure to a semiring, and combine the results
using times
.
Types
Instances
Foldable Add # | |||||
Defined in Data.Semiring Methods fold :: Monoid m => Add m -> m # foldMap :: Monoid m => (a -> m) -> Add a -> m # foldMap' :: Monoid m => (a -> m) -> Add a -> m # foldr :: (a -> b -> b) -> b -> Add a -> b # foldr' :: (a -> b -> b) -> b -> Add a -> b # foldl :: (b -> a -> b) -> b -> Add a -> b # foldl' :: (b -> a -> b) -> b -> Add a -> b # foldr1 :: (a -> a -> a) -> Add a -> a # foldl1 :: (a -> a -> a) -> Add a -> a # elem :: Eq a => a -> Add a -> Bool # maximum :: Ord a => Add a -> a # | |||||
Traversable Add # | |||||
Functor Add # | |||||
Generic1 Add # | |||||
Defined in Data.Semiring Associated Types
| |||||
Storable a => Storable (Add a) # | |||||
Semiring a => Monoid (Add a) # | |||||
Semiring a => Semigroup (Add a) # | |||||
Bounded a => Bounded (Add a) # | |||||
Enum a => Enum (Add a) # | |||||
Generic (Add a) # | |||||
Defined in Data.Semiring Associated Types
| |||||
Num a => Num (Add a) # | |||||
Read a => Read (Add a) # | |||||
Fractional a => Fractional (Add a) # | |||||
Real a => Real (Add a) # | |||||
Defined in Data.Semiring Methods toRational :: Add a -> Rational # | |||||
RealFrac a => RealFrac (Add a) # | |||||
Show a => Show (Add a) # | |||||
Eq a => Eq (Add a) # | |||||
Ord a => Ord (Add a) # | |||||
type Rep1 Add # | |||||
Defined in Data.Semiring | |||||
type Rep (Add a) # | |||||
Defined in Data.Semiring |
Instances
Foldable Mul # | |||||
Defined in Data.Semiring Methods fold :: Monoid m => Mul m -> m # foldMap :: Monoid m => (a -> m) -> Mul a -> m # foldMap' :: Monoid m => (a -> m) -> Mul a -> m # foldr :: (a -> b -> b) -> b -> Mul a -> b # foldr' :: (a -> b -> b) -> b -> Mul a -> b # foldl :: (b -> a -> b) -> b -> Mul a -> b # foldl' :: (b -> a -> b) -> b -> Mul a -> b # foldr1 :: (a -> a -> a) -> Mul a -> a # foldl1 :: (a -> a -> a) -> Mul a -> a # elem :: Eq a => a -> Mul a -> Bool # maximum :: Ord a => Mul a -> a # | |||||
Traversable Mul # | |||||
Functor Mul # | |||||
Generic1 Mul # | |||||
Defined in Data.Semiring Associated Types
| |||||
Storable a => Storable (Mul a) # | |||||
Semiring a => Monoid (Mul a) # | |||||
Semiring a => Semigroup (Mul a) # | |||||
Bounded a => Bounded (Mul a) # | |||||
Enum a => Enum (Mul a) # | |||||
Generic (Mul a) # | |||||
Defined in Data.Semiring Associated Types
| |||||
Num a => Num (Mul a) # | |||||
Read a => Read (Mul a) # | |||||
Fractional a => Fractional (Mul a) # | |||||
Real a => Real (Mul a) # | |||||
Defined in Data.Semiring Methods toRational :: Mul a -> Rational # | |||||
RealFrac a => RealFrac (Mul a) # | |||||
Show a => Show (Mul a) # | |||||
Eq a => Eq (Mul a) # | |||||
Ord a => Ord (Mul a) # | |||||
type Rep1 Mul # | |||||
Defined in Data.Semiring | |||||
type Rep (Mul a) # | |||||
Defined in Data.Semiring |
newtype WrappedNum a #
Provide Semiring and Ring for an arbitrary Num
. It is useful with GHC 8.6+'s DerivingVia extension.
Instances
Mod2
represents the integers mod 2.
It is useful in the computing of Zhegalkin polynomials.
Instances
Bounded Mod2 # | |||||
Enum Mod2 # | |||||
Generic Mod2 # | |||||
Defined in Data.Semiring Associated Types
| |||||
Read Mod2 # | |||||
Show Mod2 # | |||||
Eq Mod2 # | |||||
Ord Mod2 # | |||||
Euclidean Mod2 # | |||||
Field Mod2 # | |||||
Defined in Data.Euclidean | |||||
GcdDomain Mod2 # | |||||
Ring Mod2 # | |||||
Defined in Data.Semiring | |||||
Semiring Mod2 # | |||||
Star Mod2 # | |||||
type Rep Mod2 # | |||||
Defined in Data.Semiring |
Wrapper to mimic Set
(Sum
Int
),
Set
(Product
Int
), etc.,
while having a more efficient underlying representation.
Instances
Generic1 IntSetOf # | |||||
Defined in Data.Semiring Associated Types
| |||||
Monoid (IntSetOf a) # | |||||
Semigroup (IntSetOf a) # | |||||
Generic (IntSetOf a) # | |||||
Defined in Data.Semiring Associated Types
| |||||
Read (IntSetOf a) # | |||||
Show (IntSetOf a) # | |||||
Eq (IntSetOf a) # | |||||
Ord (IntSetOf a) # | |||||
(Coercible Int a, Monoid a) => Semiring (IntSetOf a) # | |||||
type Rep1 IntSetOf # | |||||
Defined in Data.Semiring | |||||
type Rep (IntSetOf a) # | |||||
Defined in Data.Semiring |
Wrapper to mimic Map
(Sum
Int
) v,
Map
(Product
Int
) v, etc.,
while having a more efficient underlying representation.
Instances
Generic1 (IntMapOf k :: Type -> Type) # | |||||
Defined in Data.Semiring Associated Types
| |||||
Monoid (IntMapOf k v) # | |||||
Semigroup (IntMapOf k v) # | |||||
Generic (IntMapOf k v) # | |||||
Defined in Data.Semiring Associated Types
| |||||
Read v => Read (IntMapOf k v) # | |||||
Show v => Show (IntMapOf k v) # | |||||
Eq v => Eq (IntMapOf k v) # | |||||
Ord v => Ord (IntMapOf k v) # | |||||
Defined in Data.Semiring | |||||
(Coercible Int k, Monoid k, Semiring v) => Semiring (IntMapOf k v) # | |||||
type Rep1 (IntMapOf k :: Type -> Type) # | |||||
Defined in Data.Semiring | |||||
type Rep (IntMapOf k v) # | |||||
Defined in Data.Semiring |
Ring typeclass
class Semiring a => Ring a where #
Instances
Ring CChar # | |
Defined in Data.Semiring | |
Ring CClock # | |
Defined in Data.Semiring | |
Ring CDouble # | |
Defined in Data.Semiring | |
Ring CFloat # | |
Defined in Data.Semiring | |
Ring CInt # | |
Defined in Data.Semiring | |
Ring CIntMax # | |
Defined in Data.Semiring | |
Ring CIntPtr # | |
Defined in Data.Semiring | |
Ring CLLong # | |
Defined in Data.Semiring | |
Ring CLong # | |
Defined in Data.Semiring | |
Ring CPtrdiff # | |
Defined in Data.Semiring | |
Ring CSChar # | |
Defined in Data.Semiring | |
Ring CSUSeconds # | |
Defined in Data.Semiring Methods negate :: CSUSeconds -> CSUSeconds # | |
Ring CShort # | |
Defined in Data.Semiring | |
Ring CSigAtomic # | |
Defined in Data.Semiring Methods negate :: CSigAtomic -> CSigAtomic # | |
Ring CSize # | |
Defined in Data.Semiring | |
Ring CTime # | |
Defined in Data.Semiring | |
Ring CUChar # | |
Defined in Data.Semiring | |
Ring CUInt # | |
Defined in Data.Semiring | |
Ring CUIntMax # | |
Defined in Data.Semiring | |
Ring CUIntPtr # | |
Defined in Data.Semiring | |
Ring CULLong # | |
Defined in Data.Semiring | |
Ring CULong # | |
Defined in Data.Semiring | |
Ring CUSeconds # | |
Defined in Data.Semiring | |
Ring CUShort # | |
Defined in Data.Semiring | |
Ring CWchar # | |
Defined in Data.Semiring | |
Ring IntPtr # | |
Defined in Data.Semiring | |
Ring WordPtr # | |
Defined in Data.Semiring | |
Ring Int16 # | |
Defined in Data.Semiring | |
Ring Int32 # | |
Defined in Data.Semiring | |
Ring Int64 # | |
Defined in Data.Semiring | |
Ring Int8 # | |
Defined in Data.Semiring | |
Ring Word16 # | |
Defined in Data.Semiring | |
Ring Word32 # | |
Defined in Data.Semiring | |
Ring Word64 # | |
Defined in Data.Semiring | |
Ring Word8 # | |
Defined in Data.Semiring | |
Ring CCc # | |
Defined in Data.Semiring | |
Ring CDev # | |
Defined in Data.Semiring | |
Ring CGid # | |
Defined in Data.Semiring | |
Ring CIno # | |
Defined in Data.Semiring | |
Ring CMode # | |
Defined in Data.Semiring | |
Ring CNlink # | |
Defined in Data.Semiring | |
Ring COff # | |
Defined in Data.Semiring | |
Ring CPid # | |
Defined in Data.Semiring | |
Ring CRLim # | |
Defined in Data.Semiring | |
Ring CSpeed # | |
Defined in Data.Semiring | |
Ring CSsize # | |
Defined in Data.Semiring | |
Ring CTcflag # | |
Defined in Data.Semiring | |
Ring CUid # | |
Defined in Data.Semiring | |
Ring Fd # | |
Defined in Data.Semiring | |
Ring Mod2 # | |
Defined in Data.Semiring | |
Ring Integer # | |
Defined in Data.Semiring | |
Ring () # | |
Defined in Data.Semiring | |
Ring Double # | |
Defined in Data.Semiring | |
Ring Float # | |
Defined in Data.Semiring | |
Ring Int # | |
Defined in Data.Semiring | |
Ring Word # | |
Defined in Data.Semiring | |
Ring a => Ring (Complex a) # | |
Defined in Data.Semiring | |
Ring a => Ring (Identity a) # | |
Defined in Data.Semiring | |
Ring a => Ring (Down a) # | |
Defined in Data.Semiring | |
Ring a => Ring (Dual a) # | |
Defined in Data.Semiring | |
Integral a => Ring (Ratio a) # | |
Defined in Data.Semiring | |
Ring a => Ring (IO a) # | |
Defined in Data.Semiring | |
Num a => Ring (WrappedFractional a) # | |
Defined in Data.Euclidean Methods negate :: WrappedFractional a -> WrappedFractional a # | |
Num a => Ring (WrappedIntegral a) # | |
Defined in Data.Euclidean Methods negate :: WrappedIntegral a -> WrappedIntegral a # | |
Num a => Ring (WrappedNum a) # | |
Defined in Data.Semiring Methods negate :: WrappedNum a -> WrappedNum a # | |
HasResolution a => Ring (Fixed a) # | |
Defined in Data.Semiring | |
Ring a => Ring (Op a b) # | |
Defined in Data.Semiring | |
(Ring a, Ring b) => Ring (a, b) # | |
Defined in Data.Semiring.Generic | |
Ring b => Ring (a -> b) # | |
Defined in Data.Semiring | |
Ring a => Ring (Const a b) # | |
Defined in Data.Semiring | |
(Ring a, Applicative f) => Ring (Ap f a) # | |
Defined in Data.Semiring | |
(Ring a, Ring b, Ring c) => Ring (a, b, c) # | |
Defined in Data.Semiring.Generic | |
(Ring a, Ring b, Ring c, Ring d) => Ring (a, b, c, d) # | |
Defined in Data.Semiring.Generic | |
(Ring a, Ring b, Ring c, Ring d, Ring e) => Ring (a, b, c, d, e) # | |
Defined in Data.Semiring.Generic | |
(Ring a, Ring b, Ring c, Ring d, Ring e, Ring f) => Ring (a, b, c, d, e, f) # | |
Defined in Data.Semiring.Generic | |
(Ring a, Ring b, Ring c, Ring d, Ring e, Ring f, Ring g) => Ring (a, b, c, d, e, f, g) # | |
Defined in Data.Semiring.Generic |
fromInteger :: Ring a => Integer -> a #
fromIntegral :: (Integral a, Ring b) => a -> b #
Convert from integral to ring.