The problem is that you might have: instance Poly Double where ... and then when you say: po 5 it doesn't know whether this is an Int or a Double. writing po (5::Int) should be sufficient. -- Hal Daume III "Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume On Wed, 26 Jun 2002, Alain Cremieux wrote:
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
_______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell