
Hello Philip If you are wanting element-wise addition with two lists, you can do
instance Num a => Num [a] where (+) = zipWith (+) (-) = zipWith (-) (*) = zipWith (*) fromInteger = repeat . fromInteger abs = map abs signum = map signum
Plus as you are representing timestamped values as pairs you would need a Num instance for pairs...
instance (Num a,Num b) => Num (a,b) where (+) (a,b) (x,y) = (a+x,b+y) (-) (a,b) (x,y) = (a-x,b-y) (*) (a,b) (x,y) = (a*x,b*y) fromInteger a = (fromInteger a, fromInteger a) abs (a,b) = (abs a, abs b) signum (a,b) = (signum a, signum b)
But... these instances are somewhat arbitrary, and other people would no doubt disagree with their details: For Num on lists there is the problem of uneven length lists. Also fromInteger has a valid definintion as fromInteger a = a : repeat 0 Hence, there aren't instances in the Hierarchical Libraries. Uneven lists can be solved with Streams - see Ralf Hinze's Streams, but then you move to infinite lists... Oh well. http://hackage.haskell.org/packages/archive/hinze-streams/1.0/doc/html/Data-... As for your question, you can't use a type synonym to define different class instances, you have to use a newtype. Perhaps the best illustration is in Data.Monoid - Numbers have several useful monoids, two of them are: addition (0,+) multiplication (1,*) Data.Monoid uses the Sum newtype wrapper to define the addition monoid and the Product newtype wrapper to define the multiplication monoid. Best wishes Stephen