[Haskell-cafe] Trouble with record syntax and classes
Tillmann Rendel
rendel at rbg.informatik.tu-darmstadt.de
Mon Feb 26 17:42:18 EST 2007
Hello Thomas,
Thomas Nelson schrieb:
> I'm brand new to haskell and I'm having trouble using classes. The
> basic idea is I want two classes, Sine and MetaSine, that are both
> instances of ISine. This way I can use the act method and recurse
> through the metasines and sines.
That looks too much like object oriented design and too less like
haskell for me. Have you considered using a standard algebraic type for
all variantes of sines?
About your code:
> class ISine a where
> period :: a -> Integer
> offset :: a -> Integer
> threshold :: a -> Integer
> act :: (ISine b) => Integer -> a -> b
> on :: Integer -> a -> Bool
> --on needs offset, period, threshold
> on time self = (mod (time-(offset self)) (period self)) < (threshold self)
on is the same for alle instances? then don't include it in the type
class, but provide it as polymorphic "helper" function:
on :: (ISine a) => Integer -> a -> Bool
on time self = (mod (time - (offset self)) (period self)) <
(threshold self)
and don't use self, because it could prevent you from forgetting that
haskell is not object oriented.
> data Sine =
> Sine {
> period :: Integer,
> offset :: Integer,
> threshold :: Integer,
> letter :: String
> }
You are not allowed to use period, offset and threshold as selector
names, because they are already used as members of class ISine.
> instance Sine ISine where
> act time (Sine self)
> |on time self = [letter self]
> |otherwise = []
You should provide definitions for all members of class ISine in this
instance declaration. there are no automatic use of the like-named
selectors. (in fact, the naming is illegal as pointed out above and by
the compiler).
Same for MetaSine, of course.
I strongly suggest to ignore type classes and instances for a while and
start learning about the way haskell represents data as algebraic data
types. What you tried seems comparable to using a c++ template where a
simple c function would do. Maybe working through a tutorial before
trying to implement your own ideas could be helpfull, too.
Tillmann
More information about the Haskell-Cafe
mailing list