# [Haskell-beginners] Type classes and synonyms

Stephen Tetley stephen.tetley at gmail.com
Sat Nov 21 11:34:33 EST 2009

```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.

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:

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
```