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

Jeff.Harper at handheld.com Jeff.Harper at handheld.com
Mon May 23 11:24:58 EDT 2005


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?

Here is my attempt at doing this.  If someone can give me some pointers on 
how to make this work, I'd appreciate it.


module Main where

import Complex

--------------------------------------------------------------------------------
-- toComplex should convert a real or complex number to a complex number.
--
-- Here's my goal for the type of toComplex.  Given:
-- f  :: Float
-- d  :: Double
-- cf :: Complex Float
-- cd :: Complex Double
--
-- When toComplex is applied to these, I'd like it to evaluate to the 
-- following types:
--
-- toComplex f  :: Complex Float
-- toComplex d  :: Complex Double
-- toComplex cf :: Complex Float
-- toComplex cd :: Complex Double


class ConvertibleToComplex a where
   toComplex :: RealFloat b => a -> Complex b
 
-- If I uncomment the following code, Hugs produces errors:
-- ERROR "c:\tmp\test2.hs":29 - Inferred type is not general enough
-- *** Expression    : toComplex
-- *** Expected type : (ConvertibleToComplex Float, RealFloat a) => Float 
-> Complex a
-- *** Inferred type : (ConvertibleToComplex Float, RealFloat Float) => 
Float -> Complex Float  
{-
instance ConvertibleToComplex Float where
        toComplex f = f :+ 0

instance ConvertibleToComplex Double where
        toComplex d = d :+ 0

instance ConvertibleToComplex (Complex a) where
        toComplex c = c
-}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org//pipermail/haskell-cafe/attachments/20050523/9b7bed14/attachment.htm


More information about the Haskell-Cafe mailing list