[Haskell-cafe] Question about classes from a Haskell newbie.

Pierre Barbier de Reuille pierre.barbier at cirad.fr
Mon May 23 12:11:15 EDT 2005



Jeff.Harper at handheld.com a écrit :
> Hi,
> 
> I'm new to Haskell and even newer to this list.   I have over 20 years of 
> experience in C or C++.
> 
> For fun, I decided to write a Fourier transform in Haskell.  It would be 
> convenient if I had a function that converts any real or complex number 
> into a complex number.  My attempt at doing this is below.  Hugs produces 
> errors when I try to load this code.
> 
> Essentially, I'm trying to define a class called ConvertibleToComplex. 
> There is a function in this class called toComplex.  toComplex has the 
> type:
> 
> class ConvertibleToComplex a where
>    toComplex :: RealFloat b => a -> Complex b
> 
> I'd like some instances of toComplex to return a Complex Double while 
> other instances return a Complex Float.  Doing this sort of thing in C++ 
> is fairly easy.  However, I get the feeling that I'm pushing the Haskell 
> type system to do something it isn't designed to do.  Is there a way to 
> define ConvertibleToComplex so that toComplex's return type is generic and 
> a particular instance of ConvertibleToComplex decides what the return type 
> is?

I think you misunderstand the meaning of the constraint !

toComplex :: (RealFloat b) => a -> Complex b

means the type of "b" needs to be a "RealFloat" and that it will be
inferred from the context where the function "toComplex" is called ! It
does not mean it can return any value of a type instance of "RealFloat".

For example, the instance for "Float" should be something like:

instance ConvertibleToComplex Float where
  toComplex f = ( fromRational . toRational ) f :+ fromInteger 0

And the same implementation hold for "Double" also ... (By the way I
don't know if the implementation is optimal or whatever ... but it does
work ;) ).

Pierre


-- 
Pierre Barbier de Reuille

INRA - UMR Cirad/Inra/Cnrs/Univ.MontpellierII AMAP
Botanique et Bio-informatique de l'Architecture des Plantes
TA40/PSII, Boulevard de la Lironde
34398 MONTPELLIER CEDEX 5, France

tel   : (33) 4 67 61 65 77    fax   : (33) 4 67 61 56 68


More information about the Haskell-Cafe mailing list