# [Haskell-beginners] Type classes and synonyms

Sat Nov 21 10:20:30 EST 2009

```Hello all,

Quick one for you. I have a list of (<timestamp>,<value>) pairs, and I have
defined lots of nice functions for doing various tricks with them. I'd like to
define a custom data type which is an instance of 'Num' so I can conveniently
do arithmetic on them. (I have written some tools for merging two time series
etc...)

e.g.

t (x,y) = x
v (x,y) = y
mergeSkip _  [] = []
mergeSkip [] _  = []
mergeSkip (x:xs) (y:ys)
| t x == t y = ( t x, (v x, v y) ) : (mergeSkip xs ys)
| t x > t y  = mergeSkip xs (y:ys)
| t x < t y  = mergeSkip (x:xs) ys

binaryValueFunc f [] = []
binaryValueFunc f ((t,(a,b)):xs) = (t, f a b):binaryValueFunc f xs

add xs = binaryValueFunc (+) xs

So addSkip will nicely take two of my time series, merge them by throwing out
any pairs which don't have a time stamp that exists in both and then add the
values to return a new series. All is well. But how do I make it so that I can
use the + operator to add two of them?

Well of course, I tried making a custom data type:

data Ts a b = Ts [(a,b)]
intance Ts Num where
<blaa blaa blaa>

But then I have to rewrite all of my functions to pattern match on Ts instead
of just the list. Worse, when I am writing recursive functions I have to
construct a Ts again for the recursive call. I guess I could make my own
'list-like' datastructure

data Ts a b = Empty
|           Cons ((a,b), Ts)

But that seems rather clumsy.

So I tried to make 'Ts' a type synonym for [(a,b)] which worked, but then
I couldn't declare it an instance of 'Num'.

So I guess the question is, is there any way of making a type synonym for a
type which I can define as an instance of another class? So I can use my
values of the type synonym for functions which expect the 'vanilla' type, but
define 'extra' stuff my type synonym can do?

Any help or advice greatly appreciated.

- Philip
```