Overloading and Literal Numerics

Alain Cremieux alcremi@pobox.com
Wed, 26 Jun 2002 23:18:51 +0200


Hi,
I am trying to create an overloaded function "à la Java" to be able to
call it either with a string or a number.
Ex :
definePort "http"
definePort 80
but I have problem with restrictions in Haskell's type system (or with
my lack of experience with it).

The program :

data PolyType = MkPolyLeft String | MkPolyRight (String, String) |
MkPolyNum Int deriving Show

class Poly a where
    poly :: a -> PolyType

instance Poly String where
    poly s = MkPolyLeft s
instance Poly (String, String) where
    poly p = MkPolyRight p
instance Poly Int where
    poly i = MkPolyNum i

po :: (Poly a) => a -> PolyType
po = poly

tpo1, tpo2, tpo3 :: PolyType
tpo1 = po "35"
tpo2 = po ("36", "37")
tpo3 = po 39


gives the following result  with ghc (5.03 & -fglasgow-exts) :

cl.hs:21:
    Ambiguous type variable(s) `a' in the constraint `Poly a'
    arising from use of `po' at cl.hs:21
    In the definition of `tpo3': po 39

cl.hs:21:
    Ambiguous type variable(s) `a' in the constraint `Num a'
    arising from the literal `39' at cl.hs:21
    In the first argument of `po', namely `39'
    In the definition of `tpo3': po 39

I think I need the "closed" extension of the 'class' clause to do that
(but it does not seem to be implemented yet).

Is there a better solution ?
Thank you,
Alain