module Data.Ring.FromNum
( module Data.Ring
, FromNum(FromNum, getFromNum)
) where
import Data.Ring
import Data.Monoid.Reducer
import Test.QuickCheck
newtype FromNum a = FromNum { getFromNum :: a } deriving (Eq,Show,Num,Arbitrary,CoArbitrary)
instance Num a => Monoid (FromNum a) where
mempty = fromInteger 0
mappend = (+)
instance Num a => Group (FromNum a) where
minus = ()
gnegate = negate
instance Num a => Multiplicative (FromNum a) where
one = fromInteger 1
times = (*)
instance Num a => LeftSemiNearRing (FromNum a)
instance Num a => RightSemiNearRing (FromNum a)
instance Num a => SemiRing (FromNum a)
instance Num a => Ring (FromNum a)
instance Num a => Reducer Integer (FromNum a) where
unit = fromInteger