semirings 0.2.0.1 → 0.2.1.0
raw patch · 4 files changed
+159/−241 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Data.Semiring.Free: Free :: Map a Natural -> Free a
- Data.Semiring.Free: [getFree] :: Free a -> Map a Natural
- Data.Semiring.Free: instance (GHC.Classes.Ord a, GHC.Base.Monoid a) => Data.Semiring.Semiring (Data.Semiring.Free.Free a)
- Data.Semiring.Free: instance (GHC.Classes.Ord a, GHC.Read.Read a) => GHC.Read.Read (Data.Semiring.Free.Free a)
- Data.Semiring.Free: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semiring.Free.Free a)
- Data.Semiring.Free: instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semiring.Free.Free a)
- Data.Semiring.Free: instance GHC.Show.Show a => GHC.Show.Show (Data.Semiring.Free.Free a)
- Data.Semiring.Free: liftFree :: a -> Free a
- Data.Semiring.Free: lowerFree :: Semiring s => Free s -> s
- Data.Semiring.Free: newtype Free a
- Data.Semiring.Free: runFree :: Semiring s => (a -> s) -> Free a -> s
- Data.Semiring: negate :: (Ring a, Num a) => a -> a
+ Data.Semiring: negate :: Ring a => a -> a
- Data.Semiring: one :: (Semiring a, Num a) => a
+ Data.Semiring: one :: Semiring a => a
- Data.Semiring: plus :: (Semiring a, Num a) => a -> a -> a
+ Data.Semiring: plus :: Semiring a => a -> a -> a
- Data.Semiring: times :: (Semiring a, Num a) => a -> a -> a
+ Data.Semiring: times :: Semiring a => a -> a -> a
- Data.Semiring: zero :: (Semiring a, Num a) => a
+ Data.Semiring: zero :: Semiring a => a
Files
- CHANGELOG.md +5/−0
- Data/Semiring.hs +151/−136
- Data/Semiring/Free.hs +0/−101
- semirings.cabal +3/−4
CHANGELOG.md view
@@ -1,3 +1,8 @@+0.2.1.0: [2018.09.26]+---------------------+* Removed use of DefaultSignatures+* Removed free semiring+ 0.2.0.1: [2018.07.28] --------------------- * Add instances for `Op`, `Equivalence`, `Comparison`, and `Predicate` from Data.Functor.Contravariant (upcoming base 4.12.0.0)
Data/Semiring.hs view
@@ -1,6 +1,5 @@ {-# LANGUAGE BangPatterns #-} {-# LANGUAGE CPP #-}-{-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveFoldable #-} {-# LANGUAGE DeriveFunctor #-}@@ -14,9 +13,6 @@ {-# OPTIONS_GHC -Wall #-} --- this is here because of -XDefaultSignatures-{-# OPTIONS_GHC -fno-warn-missing-methods #-}- ----------------------------------------------------------------------------- -- | -- A class for semirings (types with two binary operations, one commutative and one associative, and two respective identites), with various general-purpose instances.@@ -50,7 +46,7 @@ import Data.Bool (Bool(..), (||), (&&), otherwise, not) import Data.Complex (Complex(..)) import Data.Eq (Eq(..))-import Data.Fixed (Fixed, HasResolution)+import Data.Fixed (Fixed(MkFixed), HasResolution) import Data.Foldable (Foldable) import qualified Data.Foldable as Foldable import Data.Function ((.), const, flip, id)@@ -85,7 +81,7 @@ import Data.Ord (Down(..)) #endif import Data.Proxy (Proxy(..))-import Data.Ratio (Ratio)+import Data.Ratio (Ratio, Rational, (%)) import Data.Semigroup (Semigroup(..),Max(..), Min(..)) #if defined(VERSION_containers) import Data.Set (Set)@@ -329,16 +325,6 @@ times :: a -> a -> a -- ^ Associative Operation one :: a -- ^ Associative Unit - -- useful for defining semirings over ground types- default zero :: Num.Num a => a -- ^ 0- default one :: Num.Num a => a -- ^ 1- default plus :: Num.Num a => a -> a -> a -- ^ '(Prelude.+)'- default times :: Num.Num a => a -> a -> a -- ^ '(Prelude.*)'- zero = 0- one = 1- plus = (Num.+)- times = (Num.*)- -- | The class of semirings with an additive inverse. -- -- @'negate' a '+' a = 'zero'@@@ -349,9 +335,6 @@ #endif negate :: a -> a - default negate :: Num.Num a => a -> a- negate = Num.negate- -- | Substract two 'Ring' values. For any type 'R' with -- a 'Prelude.Num' instance, this is the same as '(Prelude.-)'. --@@ -536,65 +519,79 @@ deriving instance Ring a => Ring (Op a b) #endif -instance Semiring Int-instance Semiring Int8-instance Semiring Int16-instance Semiring Int32-instance Semiring Int64-instance Semiring Integer-instance Semiring Word-instance Semiring Word8-instance Semiring Word16-instance Semiring Word32-instance Semiring Word64--- | This instance can suffer due to floating point arithmetic.-instance Semiring Float--- | This instance can suffer due to floating point arithmetic.-instance Semiring Double-instance Semiring CUIntMax-instance Semiring CIntMax-instance Semiring CUIntPtr-instance Semiring CIntPtr-instance Semiring CSUSeconds-instance Semiring CUSeconds-instance Semiring CTime-instance Semiring CClock-instance Semiring CSigAtomic-instance Semiring CWchar-instance Semiring CSize-instance Semiring CPtrdiff-instance Semiring CDouble-instance Semiring CFloat-instance Semiring CULLong-instance Semiring CLLong-instance Semiring CULong-instance Semiring CLong-instance Semiring CUInt-instance Semiring CInt-instance Semiring CUShort-instance Semiring CShort-instance Semiring CUChar-instance Semiring CSChar-instance Semiring CChar-instance Semiring IntPtr-instance Semiring WordPtr-instance Semiring Fd-instance Semiring CRLim-instance Semiring CTcflag-instance Semiring CSpeed-instance Semiring CCc-instance Semiring CUid-instance Semiring CNlink-instance Semiring CGid-instance Semiring CSsize-instance Semiring CPid-instance Semiring COff-instance Semiring CMode-instance Semiring CIno-instance Semiring CDev-instance Semiring Natural--- | Non-negative rational numbers form a semiring.-instance Integral a => Semiring (Ratio a)+#define deriveSemiring(ty) \+instance Semiring (ty) where { \+ zero = 0 \+; one = 1 \+; plus x y = (Num.+) x y \+; times x y = (Num.*) x y \+}++deriveSemiring(Int)+deriveSemiring(Int8)+deriveSemiring(Int16)+deriveSemiring(Int32)+deriveSemiring(Int64)+deriveSemiring(Integer)+deriveSemiring(Word)+deriveSemiring(Word8)+deriveSemiring(Word16)+deriveSemiring(Word32)+deriveSemiring(Word64)+deriveSemiring(Float)+deriveSemiring(Double)+deriveSemiring(CUIntMax)+deriveSemiring(CIntMax)+deriveSemiring(CUIntPtr)+deriveSemiring(CIntPtr)+deriveSemiring(CSUSeconds)+deriveSemiring(CUSeconds)+deriveSemiring(CTime)+deriveSemiring(CClock)+deriveSemiring(CSigAtomic)+deriveSemiring(CWchar)+deriveSemiring(CSize)+deriveSemiring(CPtrdiff)+deriveSemiring(CDouble)+deriveSemiring(CFloat)+deriveSemiring(CULLong)+deriveSemiring(CLLong)+deriveSemiring(CULong)+deriveSemiring(CLong)+deriveSemiring(CUInt)+deriveSemiring(CInt)+deriveSemiring(CUShort)+deriveSemiring(CShort)+deriveSemiring(CUChar)+deriveSemiring(CSChar)+deriveSemiring(CChar)+deriveSemiring(IntPtr)+deriveSemiring(WordPtr)+deriveSemiring(Fd)+deriveSemiring(CRLim)+deriveSemiring(CTcflag)+deriveSemiring(CSpeed)+deriveSemiring(CCc)+deriveSemiring(CUid)+deriveSemiring(CNlink)+deriveSemiring(CGid)+deriveSemiring(CSsize)+deriveSemiring(CPid)+deriveSemiring(COff)+deriveSemiring(CMode)+deriveSemiring(CIno)+deriveSemiring(CDev)+deriveSemiring(Natural)+instance Integral a => Semiring (Ratio a) where+ {-# SPECIALIZE instance Semiring Rational #-} + zero = 0 % 1+ one = 1 % 1+ plus = (Num.+)+ times = (Num.*)+ {-# INLINE zero #-}+ {-# INLINE one #-}+ {-# INLINE plus #-}+ {-# INLINE times #-} deriving instance Semiring a => Semiring (Product a) deriving instance Semiring a => Semiring (Sum a) deriving instance Semiring a => Semiring (Identity a)@@ -603,64 +600,80 @@ #endif deriving instance Semiring a => Semiring (Max a) deriving instance Semiring a => Semiring (Min a)-instance HasResolution a => Semiring (Fixed a)+instance HasResolution a => Semiring (Fixed a) where+ zero = MkFixed 0+ one = MkFixed 1+ plus = (Num.+)+ times = (Num.*)+ {-# INLINE zero #-}+ {-# INLINE one #-}+ {-# INLINE plus #-}+ {-# INLINE times #-} -instance Ring Int-instance Ring Int8-instance Ring Int16-instance Ring Int32-instance Ring Int64-instance Ring Integer-instance Ring Word-instance Ring Word8-instance Ring Word16-instance Ring Word32-instance Ring Word64-instance Ring Float-instance Ring Double-instance Ring CUIntMax-instance Ring CIntMax-instance Ring CUIntPtr-instance Ring CIntPtr-instance Ring CSUSeconds-instance Ring CUSeconds-instance Ring CTime-instance Ring CClock-instance Ring CSigAtomic-instance Ring CWchar-instance Ring CSize-instance Ring CPtrdiff-instance Ring CDouble-instance Ring CFloat-instance Ring CULLong-instance Ring CLLong-instance Ring CULong-instance Ring CLong-instance Ring CUInt-instance Ring CInt-instance Ring CUShort-instance Ring CShort-instance Ring CUChar-instance Ring CSChar-instance Ring CChar-instance Ring IntPtr-instance Ring WordPtr-instance Ring Fd-instance Ring CRLim-instance Ring CTcflag-instance Ring CSpeed-instance Ring CCc-instance Ring CUid-instance Ring CNlink-instance Ring CGid-instance Ring CSsize-instance Ring CPid-instance Ring COff-instance Ring CMode-instance Ring CIno-instance Ring CDev-instance Ring Natural-instance Integral a => Ring (Ratio a)+#define deriveRing(ty) \+instance Ring (ty) where { \+ negate = Num.negate \+}++deriveRing(Int)+deriveRing(Int8)+deriveRing(Int16)+deriveRing(Int32)+deriveRing(Int64)+deriveRing(Integer)+deriveRing(Word)+deriveRing(Word8)+deriveRing(Word16)+deriveRing(Word32)+deriveRing(Word64)+deriveRing(Float)+deriveRing(Double)+deriveRing(CUIntMax)+deriveRing(CIntMax)+deriveRing(CUIntPtr)+deriveRing(CIntPtr)+deriveRing(CSUSeconds)+deriveRing(CUSeconds)+deriveRing(CTime)+deriveRing(CClock)+deriveRing(CSigAtomic)+deriveRing(CWchar)+deriveRing(CSize)+deriveRing(CPtrdiff)+deriveRing(CDouble)+deriveRing(CFloat)+deriveRing(CULLong)+deriveRing(CLLong)+deriveRing(CULong)+deriveRing(CLong)+deriveRing(CUInt)+deriveRing(CInt)+deriveRing(CUShort)+deriveRing(CShort)+deriveRing(CUChar)+deriveRing(CSChar)+deriveRing(CChar)+deriveRing(IntPtr)+deriveRing(WordPtr)+deriveRing(Fd)+deriveRing(CRLim)+deriveRing(CTcflag)+deriveRing(CSpeed)+deriveRing(CCc)+deriveRing(CUid)+deriveRing(CNlink)+deriveRing(CGid)+deriveRing(CSsize)+deriveRing(CPid)+deriveRing(COff)+deriveRing(CMode)+deriveRing(CIno)+deriveRing(CDev)+deriveRing(Natural)+instance Integral a => Ring (Ratio a) where+ negate = Num.negate+ {-# INLINE negate #-}+ #if MIN_VERSION_base(4,6,0) deriving instance Ring a => Ring (Down a) #endif@@ -669,7 +682,9 @@ deriving instance Ring a => Ring (Identity a) deriving instance Ring a => Ring (Max a) deriving instance Ring a => Ring (Min a)-instance HasResolution a => Ring (Fixed a)+instance HasResolution a => Ring (Fixed a) where+ negate = Num.negate+ {-# INLINE negate #-} {-------------------------------------------------------------------- Instances (containers)
− Data/Semiring/Free.hs
@@ -1,101 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE NoImplicitPrelude #-}-{-# LANGUAGE StandaloneDeriving #-}--#if !MIN_VERSION_base(4,9,0)-{-# OPTIONS_GHC -fno-warn-orphans #-}-#endif---- | Polynomials with natural number coefficients--- form a commutative semiring. In fact, this is--- the free commutative semiring.-module Data.Semiring.Free- (-#if defined(VERSION_containers)-#if MIN_VERSION_base(4,8,0)- Free(..)- , runFree- , lowerFree- , liftFree-#endif-#endif- ) where--#if defined(VERSION_containers)-#if MIN_VERSION_base(4,8,0)-import Data.Bool (otherwise)-import Data.Coerce (Coercible, coerce)-import Data.Eq (Eq)-import Data.Functor.Identity (Identity(..))-import Data.Function (flip,id, (.))-import Data.Ord (Ord)-#if !MIN_VERSION_base(4,9,0)-import Data.Semigroup ()-#endif-import Data.Semiring-import Data.Map.Strict (Map)-import qualified Data.Map.Strict as Map-import Data.Monoid (Monoid(..))--import GHC.Show (Show)-import GHC.Read (Read)-import GHC.Real (even, div)-import Numeric.Natural---- | N[x], polynomials with natural number--- coefficients form the free commutative semiring--- on a single generator {x}.-newtype Free a = Free- { getFree :: Map a Natural- } deriving (Show, Read, Eq, Ord, Semiring)--#if !MIN_VERSION_base(4,9,0)-deriving instance Monoid a => Monoid (Identity a)-#endif---- | Run a 'Free'-runFree :: Semiring s => (a -> s) -> Free a -> s-runFree f = getAdd #.- Map.foldMapWithKey- ((rep .# Add) . product . Identity . f)- . getFree-{-# INLINE runFree #-}---- | Run a 'Free', interpreting it in the underlying semiring.-lowerFree :: Semiring s => Free s -> s-lowerFree = runFree id-{-# INLINE lowerFree #-}---- | Create a 'Free' with one item.-liftFree :: a -> Free a-liftFree = Free . flip Map.singleton one-{-# INLINE liftFree #-}--rep :: Monoid m => m -> Natural -> m-rep x = go- where- go 0 = mempty- go 1 = x- go n- | even n = r `mappend` r- | otherwise = x `mappend` r `mappend` r- where- r = go (n `div` 2)-{-# INLINE rep #-}---- | Coercive left-composition.-infixr 9 #.-(#.) :: Coercible b c => (b -> c) -> (a -> b) -> a -> c-(#.) _ = coerce-{-# INLINE (#.) #-}---- | Coercive right-composition.-infixr 9 .#-(.#) :: Coercible a b => (b -> c) -> (a -> b) -> a -> c-(.#) f _ = coerce f-{-# INLINE (.#) #-}--#endif--#endif
semirings.cabal view
@@ -1,6 +1,6 @@ name: semirings category: Algebra, Data, Data Structures, Math, Maths, Mathematics-version: 0.2.0.1+version: 0.2.1.0 license: BSD3 cabal-version: >= 1.10 license-file: LICENSE@@ -69,8 +69,8 @@ You can disable the use of the `vector` package using `-f-vector`. . Disabling this may be useful for accelerating builds in sandboxes for expert users.- default: True- manual: True+ default: True+ manual: True library default-language: Haskell98@@ -94,7 +94,6 @@ if impl(ghc >= 7.2) exposed-modules: Data.Semiring- Data.Semiring.Free Data.Star if impl(ghc >= 7.6.1) exposed-modules: