semirings 0.2.1.0 → 0.2.1.1
raw patch · 3 files changed
+51/−9 lines, 3 filesPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
API changes (from Hackage documentation)
+ Data.Semiring: WrapNum :: a -> WrappedNum a
+ Data.Semiring: [unwrapNum] :: WrappedNum a -> a
+ Data.Semiring: instance Data.Foldable.Foldable Data.Semiring.WrappedNum
+ Data.Semiring: instance Data.Traversable.Traversable Data.Semiring.WrappedNum
+ Data.Semiring: instance Foreign.Storable.Storable a => Foreign.Storable.Storable (Data.Semiring.WrappedNum a)
+ Data.Semiring: instance GHC.Base.Functor Data.Semiring.WrappedNum
+ Data.Semiring: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semiring.WrappedNum a)
+ Data.Semiring: instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semiring.WrappedNum a)
+ Data.Semiring: instance GHC.Enum.Bounded a => GHC.Enum.Bounded (Data.Semiring.WrappedNum a)
+ Data.Semiring: instance GHC.Enum.Enum a => GHC.Enum.Enum (Data.Semiring.WrappedNum a)
+ Data.Semiring: instance GHC.Generics.Generic (Data.Semiring.WrappedNum a)
+ Data.Semiring: instance GHC.Generics.Generic1 Data.Semiring.WrappedNum
+ Data.Semiring: instance GHC.Num.Num a => Data.Semiring.Ring (Data.Semiring.WrappedNum a)
+ Data.Semiring: instance GHC.Num.Num a => Data.Semiring.Semiring (Data.Semiring.WrappedNum a)
+ Data.Semiring: instance GHC.Num.Num a => GHC.Num.Num (Data.Semiring.WrappedNum a)
+ Data.Semiring: instance GHC.Read.Read a => GHC.Read.Read (Data.Semiring.WrappedNum a)
+ Data.Semiring: instance GHC.Real.Fractional a => GHC.Real.Fractional (Data.Semiring.WrappedNum a)
+ Data.Semiring: instance GHC.Real.Real a => GHC.Real.Real (Data.Semiring.WrappedNum a)
+ Data.Semiring: instance GHC.Real.RealFrac a => GHC.Real.RealFrac (Data.Semiring.WrappedNum a)
+ Data.Semiring: instance GHC.Show.Show a => GHC.Show.Show (Data.Semiring.WrappedNum a)
+ Data.Semiring: newtype WrappedNum a
Files
- CHANGELOG.md +5/−0
- Data/Semiring.hs +45/−8
- semirings.cabal +1/−1
CHANGELOG.md view
@@ -1,3 +1,8 @@+0.2.1.1: [2018.XX.XX]+---------------------+* Fixed build on GHC-7.4+* Provide `Semiring` and `Ring` for an arbitrary `Num` via `WrappedNum` newtype.+ 0.2.1.0: [2018.09.26] --------------------- * Removed use of DefaultSignatures
Data/Semiring.hs view
@@ -35,6 +35,7 @@ -- * Types , Add(..) , Mul(..)+ , WrappedNum(..) -- * Ring typeclass , Ring(..)@@ -46,13 +47,13 @@ import Data.Bool (Bool(..), (||), (&&), otherwise, not) import Data.Complex (Complex(..)) import Data.Eq (Eq(..))-import Data.Fixed (Fixed(MkFixed), HasResolution)+import Data.Fixed (Fixed, HasResolution) import Data.Foldable (Foldable) import qualified Data.Foldable as Foldable import Data.Function ((.), const, flip, id) import Data.Functor (Functor(..)) #if MIN_VERSION_base(4,12,0)-import Data.Functor.Contravariant (Predicate(..), Comparison(..), Equivalence(..), Op(..))+import Data.Functor.Contravariant (Predicate(..), Equivalence(..), Op(..)) #endif import Data.Functor.Identity (Identity(..)) #if defined(VERSION_unordered_containers)@@ -63,6 +64,7 @@ import qualified Data.HashSet as HashSet #endif import Data.Int (Int, Int8, Int16, Int32, Int64)+import qualified Data.List as List import Data.Maybe (Maybe(..)) #if MIN_VERSION_base(4,12,0) import Data.Monoid (Ap(..))@@ -273,6 +275,39 @@ {-# INLINE mempty #-} {-# INLINE mappend #-} +-- | Provide Semiring and Ring for an arbitrary Num. It is useful with GHC 8.6+'s DerivingVia extension.+newtype WrappedNum a = WrapNum { unwrapNum :: a }+ deriving+ ( Bounded+ , Enum+ , Eq+ , Foldable+ , Fractional+ , Functor+#if MIN_VERSION_base(4,6,1)+ , Generic+ , Generic1+#endif+ , Num.Num+ , Ord+ , Read+ , Real+ , RealFrac+ , Show+ , Storable+ , Traversable+ , Typeable+ )++instance Num.Num a => Semiring (WrappedNum a) where+ plus = (Num.+)+ zero = 0+ times = (Num.*)+ one = 1++instance Num.Num a => Ring (WrappedNum a) where+ negate = Num.negate+ {-------------------------------------------------------------------- Classes --------------------------------------------------------------------}@@ -601,8 +636,8 @@ deriving instance Semiring a => Semiring (Max a) deriving instance Semiring a => Semiring (Min a) instance HasResolution a => Semiring (Fixed a) where- zero = MkFixed 0- one = MkFixed 1+ zero = 0+ one = 1 plus = (Num.+) times = (Num.*) {-# INLINE zero #-}@@ -941,10 +976,12 @@ listAdd (x:xs) (y:ys) = (x + y) : listAdd xs ys {-# NOINLINE [0] listAdd #-} -listTimes [] (_:xs) = zero : listTimes [] xs-listTimes (_:xs) [] = zero : listTimes xs []-listTimes [] [] = []-listTimes (x:xs) (y:ys) = (x * y) : listTimes xs ys+listTimes _ [] = []+listTimes xs ys = List.foldr f [] xs+ where+ f x zs = List.foldr (g x) id ys (zero : zs)+ g x y a [] = x `times` y : a []+ g x y a (z:zs) = x `times` y `plus` z : a zs {-# NOINLINE [0] listTimes #-} type ListBuilder a = forall b. (a -> b -> b) -> b -> b
semirings.cabal view
@@ -1,6 +1,6 @@ name: semirings category: Algebra, Data, Data Structures, Math, Maths, Mathematics-version: 0.2.1.0+version: 0.2.1.1 license: BSD3 cabal-version: >= 1.10 license-file: LICENSE