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