DavidA wrote:
> Hi,
>> I am trying to implement quadratic fields Q(sqrt d). These are numbers of the
> form a + b sqrt d, where a and b are rationals, and d is an integer.
>> ...
>> class IntegerType a where
> value :: Integer
>> The problem is, this doesn't work. GHC complains:
> The class method `value'
> mentions none of the type variables of the class IntegerType a
> When checking the class method: value :: Integer
> In the class declaration for `IntegerType'
>> Is what I'm trying to do reasonable? If no, what should I be doing instead? If
> yes, why doesn't GHC like it?
You are on the right track. The problem with the class method is that it
doesn't use type 'a' anywhere, consider
> f :: Integer
> f = value
What class instance should be used here?
The solution is to use a dummy parameter:
> class IntegerType a where
> value :: a -> Integer
And call it like:
> f = value (undefined :: Two)
So for instance:
> instance IntegerType d => Show (QF d) where
> show (QF a b) = show a ++ " + " ++ show b ++ " sqrt "
> ++ show (value (undefined::d))
The problem is that this doesn't work, because d is not in scope, you
need the scoped type variables extension:
> valueOfQF :: forall a. IntegerType a => QF a -> Integer
> valueOfQF qf = value (undefined :: a)
or maybe better, change the class:
> class IntegerType a where
> value :: QF a -> Integer
Now you can simply use
> instance IntegerType d => Show (QF d) where
> show qf@(QF a b) = show a ++ " + " ++ show b ++ " sqrt "
> ++ show (value qf)
Twan