[Haskell-beginners] Type classes and synonyms
haskell-beginners at foo.me.uk
Sat Nov 21 10:20:30 EST 2009
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
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
addSkip xs ys = add $ mergeSkip xs ys
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
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.
More information about the Beginners