Data.Monoid in the base package specifies newtypes Sum and Product. It would be convenient if these newtypes had appropriate Num instances, which are trivial to write in plain Haskell:
import Data.Monoid liftTy2 wrap unwrap op x y = wrap $ unwrap x `op` unwrap y liftTy wrap unwrap f = wrap . f . unwrap liftSum = liftTy Sum getSum liftSum2 = liftTy2 Sum getSum instance (Num a) => Num (Sum a) where (+) = liftSum2 (+) (-) = liftSum2 (-) (*) = liftSum2 (*) abs = liftSum abs negate = liftSum negate signum = liftSum signum fromInteger = Sum . fromInteger liftProd = liftTy Product getProduct liftProd2 = liftTy2 Product getProduct instance (Num a) => Num (Product a) where (+) = liftProd2 (+) (-) = liftProd2 (-) (*) = liftProd2 (*) abs = liftProd abs negate = liftProd negate signum = liftProd signum fromInteger = Product . fromInteger
{-# LANGUAGE StandaloneDeriving, GeneralizedNewtypeDeriving #-} import Data.Monoid deriving instance Num a => Num (Sum a) deriving instance Num a => Num (Product a)